ユーザーディレクトリに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```
スクリプトを「実行」する方法はいくつかありますが、微妙な違いがあります。
sh /path/to/script
:スクリプトに実行権限は必要ありません!実際、あなたはexecutesh
を実行し、スクリプトを読み取って解釈します。だから、あなたがそれを読む瞬間に、それを実行することはできませんが、それを読んでそれに応じるようにシェルに伝えますこれは、それを実行します。/path/to/script
を追加した後#!/bin/sh
ヘッダーと実行権限を付与します。この場合、スクリプト自体を実行し、Shebangヘッダーはどのシェルをロードするかを指示します. /path/to/script
:これは、現在のシェルにスクリプトをロードして、その内容をシェルプロンプトに入力しているかのように解釈するように指示します。ここでも、ファイルを実行実行せずに読み取りを行うため、実行特権は必要ありません。違いをスクリプトで表示させることができます。つまり、echo "$0"
。最初のケースではsh
へのパス、2番目のケースではスクリプトへのパス、3番目のケースでは現在のシェルへのパスが出力されます。
実行していないので、それをsh
インタープリターに読み取っています(shは実行ビットをチェックしません)。
最初の行として#!/bin/sh
を追加した場合。次に、それを実行することができます。 ./file-name
また、sh ./file-name
オプションが使用できない場合でも(インタプリタされていないプログラム(C、C++、Pascal、goなど)の場合と同様)、それを読み取ることができるユーザーは、コピーを作成して実行ビットをオンに設定できます。彼らのコピー(あなたがそれを読むことができれば、あなたはそれを実行することができます)。