誰かが尋ねたAsk Ubuntuに関する質問permission denied
Bashシェルに入ると、なぜこれが起こりますか?
/etc/profile
ファイルに実行権限がないためです。ルートであっても実行できません(sudo /path/to/file/with/no/execute/bits
自動エラーで失敗sudo /path/to...: command not found
)。私も根を知っていますできる実行ビットなしでディレクトリに入り、実行不可能なファイルの実行を絶対禁止するのは特別です。チャットではEliah Kaganは、ルートが実行不可能なファイルを実行できない理由は、ルートを保護するためであると信じています。(おそらく誤って危険なコードが実行されたからです)。
私は誰かがそれを実行したい理由が気になり、/etc/profile
誰かがそれを実行したい場合は実際にsource
それをしたいと思いました(環境変数とシェル変数を設定する設定ファイルなので)。その後、source
通常のファイルには実行権限が必要ないことに気づきました。代わりに、source
現在のシェルでファイルを実行してください!ファイルには任意のコマンドを含めることができ、. file
直接実行されます。
実行権限を制限すると、潜在的に危険なコードが誤って実行されるのを防ぐことができますが、なぜsource
このコマンドを使用して実行できないファイルを実行できますか?
答え1
実行不可能なファイルを実行すると失敗しそうではありません。故意に潜在的に危険なコードが誤って実行されるのを防ぎます。これは意味の一部にすぎません。 「ファイル、スクリプト、またはELFインタプリタの実行権限が拒否されると」execve
失敗します。EACCES
(引用しています。Linuxexecve
のマンページ。POSIX例:「新しいプロセスイメージファイルのパスプレフィックスにリストされているディレクトリに対する検索権限が拒否されたか、新しいプロセスイメージファイルに対する実行権限が拒否されました」を置かなかった。自分で離れています。
私の考えでは、説明はやや単調です。実行と調達の仕様が異なる。直接実行するには、カーネルが与えられたコマンドを実行し、実行権限を適用する必要があります。ファイルを取得するとは、実際にファイルを読み取って実行することを意味します。bash
マンページ「検索されたファイルはPATH
実行可能ファイルである必要はありません」と明確に指定されています。POSIX と「しかし、一般的なコマンド検索とは異なり、指すユーティリティは実行可能である必要はありません。 」(.
と同じですsource
。)
バイナリが実行可能でなくても、バイナリを取得するために使用されたのと同様の技術を使用して実行できます。
$ cp /bin/ls .
$ chmod 644 ls
$ /lib64/ld-2.26.so ./ls
先行は達成するのが難しい~のよりPOSIXとの比較はbash
興味深いです。非POSIXモードでパスなしで引数が与えられた場合、POSIXモードは現在のディレクトリで検索しようとします。 POSIXではこれを禁止します。source
.
source
PATH
いくつかの以前の実装は現在のディレクトリから検索します。文書、値があっても道それを許可しないでください。この動作は、ユーザーがトロイの木馬に対する脆弱性を回避しようとする可能性があるという懸念のため、このPOSIX.1-2008ボリュームでは省略されました。指す外の道。
source
ただし、パスのある引数はどの.
ような場合でも処理されるため、現在の議論では実際には大きく変わりません。 (実際に何かを試すときは、驚きをsource
避けるために、常にパス、相対パスをパラメータとして使用する必要があります。source
返品あなたのPATH
。というファイルを作成し、inを使ってファイルをインポートtest
しsource test
てbash
何を意味するのかを確認してください。 )