現在、私はラズベリーパイでLinuxで遊んでおり、権限システムがどのように機能するかを理解しようとしています。
私は2人のユーザーセットを作成し、そのうちの1人は自分のドキュメントフォルダに次の権限を持つPythonスクリプトを作成しました-rwx--x---
。
他のグループメンバーはpython hello.pyコマンドを使用してファイルを実行する必要がありますが、権限が拒否されたと言います。
唯一の方法は、グループに読み取り権限を付与することです。-rwxr-x---
pythonスクリプトを実行するのに実行権限が不足しているのはなぜですか?
答え1
カーネルがファイルを実行するには、実行権限が十分です。
ファイルがで始まる場合は、スクリプトであることを#!
確認し、行を解析してインタプリタのパスとオプションの引数を見つけ、そのオプションの引数とファイルパスを引数として使用してインタプリタを実行します。
たとえば、ファイルが次から始まる場合:
#! /usr/bin/python -E
カーネルexecve("/path/to/the-script", ["the-script", "arg"], [envs])
がに変わりますexecve("/usr/bin/python", ["/usr/bin/python", "-E", "/path/to/the-script", "arg"], [envs])
。
実行権限がなかった場合は、ここまで到達できませんでした。
このとき重要なのはインタプリタの実行権限だ。実行ファイルの場合は正常に動作します。
しかし、後で開いて内部コードを読んで解釈/usr/bin/python
したいと思います。/path/to/the-script
これを行うには、ファイルに対する読み取り権限が必要です。前回以降にeuidを変更していない場合(たとえば、ファイルに/usr/bin/python
suid / sgidビットがある場合)、以前に読み取り権限がなかった場合は、まだその権限がありません。
したがって、実行権限だけでスクリプトを正常に実行できます。ただ、インタプリタがコンテンツを読み取るために開く必要がある場合は失敗します(そしてスクリプトを実行したいシェルではなく、インタプリタからのエラーメッセージが表示されます)。次のスクリプトで:
#! /bin/echo Here goes
echo
読み取り用にファイルを開こうとする試みがないため、読み取り権限がなくても問題にならないことがわかります。
答え2
スクリプトを実行するために「x」権限は必要ありません。カーネルの観点から見ると、これは単純なテキストファイルであり、それを実行するインタプリタではありません。 Pythonスクリプトを実行すると、Something.pyではなくPythonバイナリが実行されます。
ただし、インタプリタがスクリプトを読み込んで実行できる必要があるため、スクリプトにはrフラグが必要です。
ほとんどのインタプリタは、実行可能フラグなしではスクリプトを実行しません。可能であっても、これは安全予防措置です。
したがって、スクリプトを実行するにはrフラグとxフラグが必要です。