私の混乱
a.out
Ubuntu 12.10で実行されたプログラムの出力。 Red Hat システムでは、a.out
端末で実行すると実行されます。 Ubuntuでは、出力を取得するには./a.out
実行する必要があります。 「a.out」が動作しません。
誰かがコマンド間の違いを説明できますか?
答え1
経験する動作は、環境変数の違いによって異なります$PATH
。基本的に、オペレーティングシステムの呼び出しを使用してプログラム$PATH
が呼び出されたときに特定の実行可能ファイルを順次検索するコロンで区切られたディレクトリのリストです。通常、現在の作業ディレクトリを参照する相対パスコンポーネントまたは空の文字列を含めることexec
ができます。たとえば、現在のディレクトリがの一部である場合は、名前だけで現在の作業ディレクトリのファイルを実行できます。現在のディレクトリが存在しない場合は、実行可能ファイルへの相対パスまたは絶対パスを指定する必要があります。$PATH
.
$PATH
a.out
$PATH
./a.out
相対パスコンポーネントを含めると、以前のディレクトリの実行可能ファイルがリストの後半にあるディレクトリの実行可能ファイルを隠す可能性があるため、潜在的なセキュリティ上の$PATH
リスクがあります。$PATH
たとえば、現在の作業ディレクトリパスへの変更を検討してください.
。たとえば、攻撃者が現在のディレクトリに通常のシステムユーティリティと名前を共有する悪意のあるスクリプトを配置した場合(通常はルート所有ディレクトリを置き換えるよりもはるかに簡単です)、バイナリの場合、ユーザーの悪意のあるスクリプトは次のような状況で間違いを犯します。として呼び出されます:システムを呼び出す意図として。の末尾にのみ追加された場合でも、ユーザーは、特定のシステムに存在しない通常のユーティリティと名前を共有する現在のディレクトリの実行可能ファイルを誤って呼び出すように欺くことができます。だからこそ一般的です。/bin
$PATH
ls
/bin
ls
.
$PATH
いいえ相対パスコンポーネントをデフォルト値の一部にします$PATH
。