web-dev-qa-db-ja.com

実行許可なしでファイルを実行するにはどうすればよいですか?

自分に実行許可を(chmod u+xで)与えずにファイルを実行するにはどうすればよいですか?

「プログラムとしてのファイルの実行を許可する」チェックマークをオンにすると、チェックマークはすぐに削除されます。

11
kiri

ファイルの所有権を確認する

ファイルを所有していることが確実でない限り、これを先に実行してください。

次のいずれかの方法で実行しようとしているファイルを所有していることを確認してください。

グラフィカル

  1. ファイルを右クリックします。
  2. 「プロパティ」をクリックします。
  3. [権限]タブをクリックします。
  4. [所有者]フィールドにユーザー名が表示されていることを確認します。下に「ファイルの所有権の変更」が表示されない場合

コマンドライン

  1. ターミナルでこのコマンドを実行します

    [ ! -O "/path/to/file" ] && echo "You don't own the file"
    
  2. You don't own the file」と表示される場合は、以下の「ファイルの所有権を変更する」を参照してください。

ファイルの所有権を変更する

ターミナルでこのコマンドを実行します

Sudo chown $USER:$(id -gn $USER) "/path/to/file"

実行可能ファイル

コメント by Lekensteyn on answer for question about chmod on NTFSパーティションは、それ自身の質問と回答に値すると思いますが、Lekensteynに全面的に貢献しています。

次のコマンドを実行可能ファイルに使用します(/path/to/executableを正しいパスに置き換えます):

  • 64ビットの実行可能ファイル:

    /lib64/ld-linux-x86-64.so.2 /path/to/executable
    
  • 32ビットの実行可能ファイル:

    /lib/ld-linux.so.2 /path/to/executable
    

上記が機能しない(またはファイルが見つからないというエラーが発生する)場合は、上記のコマンドの前にこれを使用してみてください

cd "$(dirname /path/to/executable)"

上記のすべてのコマンドは、テキストベースのスクリプト(Bash、Python、Perlなど)では機能しません。以下を参照してください。

プログラムが64ビットか32ビットかを確認します

このコマンドを使用して、実行可能ファイルが32(x86)または64(x86-64)ビットかどうかを確認します

objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'

i386:x86-64と表示されている場合、64ビットです。 i386のみの場合、32ビットです。


スクリプト

テキストベースのスクリプト(Bash、Python、Perlなど)の場合、ファイルの最初の#!行で指定されたコマンドを使用する必要があります。

たとえば、ファイルの最初の行が

#!/usr/bin/env python3

次に、ターミナルでこれらのコマンドを実行します(/path/to/fileを正しいパスに置き換えます)

cd "$(dirname /path/to/file)"       # Not strictly necessary, see section below

# Replace '/usr/bin/env python3' with the first line without the front #!
/usr/bin/env python3 /path/to/file  # Use './file' if you want

Java .jarファイル

Java実行可能jarの場合、次のコマンドを使用できます(/path/to/jarを正しいパスに置き換えます)。

cd "$(dirname /path/to/jar)"   # Not strictly necessary, see section below
Java -jar /path/to/jar

cd "$(dirname /path/to/file)"が必要ないとき

これらは、何らかの方法でプログラムを実行する前にcd "$(dirname /path/to/file)"を使用する必要がない状況です。少なくとも1つが真の場合、最初にcdは必要ありません。

  • プログラムはファイル操作自体を実行しません(例:apt-getのみを使用します)
  • プログラムは、cd(または同等のもの)を使用して、ファイル操作を行う前に絶対パスに変更します(例:cd "$(dirname "$0")"
  • プログラムは、相対パス(./で始まるパスまたはスラッシュなしで始まるパス)を参照しません。

不明な場合は、cd "$(dirname "$0")"(または同等のもの)をスクリプトの先頭に追加するか(該当する場合)、とにかくcd "$(dirname /path/to/file)"を使用します。

14
kiri

シェルスクリプトの場合、別のシェルスクリプトから「ソース」できます。

#!/bin/bash
# This script runs another script indirectly, by sucking in its contents and evaluating inline:

source /path/to/script/which/lost/its/exec/flag "$@"

「$ @」は、必要に応じてコマンドラインパラメーターを追加します。

とはいえ、これはおそらく根本的な問題の最善の解決策ではありませんが、代替案を提供するためにその問題について十分に知りません。

0
Stabledog