web-dev-qa-db-ja.com

Linuxでファイルを実行する権限が機能しないのはなぜですか?

ユーザーディレクトリにbashスクリプトを作成します。たとえば、実行すると「Hello world」というテキストが表示されます。同時に、自分(ファイルの所有者)とグループのアカウントだけが実行できるようにしたいのですが、残りはすべて読み取り専用です。したがって、chmodを使用して権限を設定し、グループからではなくユーザーとしてログインし、ファイルのあるディレクトリに移動し、shを介して実行すると、突然実行され、「Access denied」ではなく「Hello world」と表示されます。 」しかし、これはどのようにして可能ですか、私は他の人が実行することを禁止しますか?それは何ですか?どういう意味ですか?

[user@localhost ~]$ ls -la *.sh
-rwxr-xr-- 1 user users 0 Feb 19 01:21 file.sh
[user@localhost ~]$ sh file.sh
Hello World
[user@localhost ~]$ groups
users wheel
[user@localhost ~]$ su - testu
Password: 
[testu@localhost ~]$ groups
testu
[testu@localhost ~]$ cd ../user
[testu@localhost user]$ sh file1.txt
Hello World```
2
MadEvil

スクリプトを「実行」する方法はいくつかありますが、微妙な違いがあります。

  • 実行sh /path/to/script:スクリプトに実行権限は必要ありません!実際、あなたはexecuteshを実行し、スクリプトを読み取って解釈します。だから、あなたがそれを読む瞬間に、それを実行することはできませんが、それを読んでそれに応じるようにシェルに伝えますこれは、それを実行します。
  • 直接実行/path/to/scriptを追加した後#!/bin/shヘッダーと実行権限を付与します。この場合、スクリプト自体を実行し、Shebangヘッダーはどのシェルをロードするかを指示します
  • 実行. /path/to/script:これは、現在のシェルにスクリプトをロードして、その内容をシェルプロンプトに入力しているかのように解釈するように指示します。ここでも、ファイルを実行実行せずに読み取りを行うため、実行特権は必要ありません。

違いをスクリプトで表示させることができます。つまり、echo "$0"。最初のケースではshへのパス、2番目のケースではスクリプトへのパス、3番目のケースでは現在のシェルへのパスが出力されます。

15
Eugen Rieck

実行していないので、それをshインタープリターに読み取っています(shは実行ビットをチェックしません)。

最初の行として#!/bin/shを追加した場合。次に、それを実行することができます。 ./file-name

また、sh ./file-nameオプションが使用できない場合でも(インタプリタされていないプログラム(C、C++、Pascal、goなど)の場合と同様)、それを読み取ることができるユーザーは、コピーを作成して実行ビットをオンに設定できます。彼らのコピー(あなたがそれを読むことができれば、あなたはそれを実行することができます)。

6
ctrl-alt-delor