エコーされるBashスクリプトを作成しました。「こんにちは世界」。テストユーザーも作成しましたが、単発、使用adduser
。
以下のようにファイルを実行する権限を持つ人は誰もいませんls
。
$ ls -l hello.sh
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh
上記から、ファイルの所有者が誰であるかがわかります。聖ジョージ読み取りおよび書き込み権限のみがあり、実行権限はありません。しかし、次のようにログインしました。聖ジョージスクリプトを直接実行できます。
$ . hello.sh
Hello World
スノーバーとして、私は次のようにログインしました。単発、読み取り権限のみが、まだファイルを実行できます。
$ su bob
Password:
$ . /home/george/testdir/hello.sh
Hello World
どうなりますか?
答え1
あなたの例では、ファイルを実行せずに購入それらを。
実行が通過する
$ ./hello.sh
これには実行ライセンスが必要です。この場合、スクリプトファイルのコマンドが実行されるサブシェルが開きます。
購入、すなわち。
$ . hello.sh
(間にスペースがあります)のみ読むファイルとシェル. hello.sh
どこでコマンドを呼び出しますか?その後、読み取り権限で、つまりサブシェルを開かずにコマンドを直接実行します。ファイルが読み取り専用であるため、読み取り権限のみで十分な操作が可能です。 (また、スクリプトファイル名を次のように宣言することに注意してください。コールPATH
検索hello.sh
、したがって他のものがある場合PATH
それ補給品があるでしょう!明示的なパスを使用してください。たとえば、. ./hello.sh
「正しいパス」が得られたことを確認します。)
これが発生しないようにするには、スクリプトを使用してはいけないすべてのユーザーの読み取り権限も削除する必要があります。とにかくこれは合理的です。このスクリプトの不正使用が本当に気になるなら
- 権限のないユーザーは、スクリプトの内容をコピーして新しいファイルに貼り付けるだけで、不足している実行権限を簡単にバイパスすることができ、このファイルに実行権限を付与できます。
- Kusalanandaが指摘したように、権限のないユーザーは次のように呼び出してスクリプトを簡単に使用できます。
変えるsh ./hello.sh
./hello.sh
この場合でも、スクリプトファイルに対する読み取り権限のみが必要です(参照この回答例えば)。
一般的な注意事項として、スクリプトの取得とスクリプトの実行の間に微妙な違いがあることに注意してください(参照この問題例えば)。
答え2
実行権限は単にファイルです処刑された。ただし、ファイルをインポートしたり(. hello.sh
またはsource hello.sh
)シェルインタプリタに引数として渡したりすると、(sh hello.sh
)ファイルを実行するのではなく、別のコマンド(.
またはsh
)を実行することになります。ファイルをパラメータとして渡すこのコマンドで。
したがって、あなたの質問に答えると、ファイルを「実行」できる理由は、. hello.sh
実行できる理由と同じですcat hello.sh
。読むファイルを実行する代わりに。
表示するには:
$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh
$ cat ./foo.sh
#!/bin/sh
echo Hello
$ ./foo.sh
bash: ./foo.sh: Permission denied
$ sh ./foo.sh
Hello
ご覧のとおり、実際にスクリプトを実行することはできませんが、読むことはできます(存在するかどうかcat
)sh
。
答え3
最も短いバージョンは次のとおりです。実装する文書。誰ですか読むシェルに入り、実行します。
気づく一部言語ソルバーは、実行を要求したファイルの実行権限を確認し、ユーザーに適切な権限がない場合は実行を拒否します。ただし、これは完全に特定のインタプリタ作成者の裁量によるチェックであり、オペレーティングシステムによっては実施されません。
ちょっとした事故実験をしてみよう。
私の考えでは、私たち全員が同意できると思います。もしプログラムには実行権限があるため、このプログラムを実行できる必要があります。私はまた、このプログラムが「Hello World」文字列をコンソールに印刷することを許可する必要があることに同意できると思います。
また、ファイルに読み取り権限がある限り、プログラムはファイルを読み取ることができる必要があることにも同意することができます。ファイルの内容が何であるかは問題ではありません。ファイルに読み取り許可ビットが設定されている場合は、プログラムがそのファイルを読み取ることができる必要があります。
今、私たちはプログラムがコンソールに「Hello World」を印刷することを許可する必要があることに同意し、プログラムがファイルを読み取ることを許可する必要があることに同意しました。また、プログラムを許可する必要があることにも論理的に同意する必要があります。ファイルを読むにはそしてコンソールに「Hello World」を印刷します。そして、プログラムがファイルを読み取ることができるかどうかは内容ではなく権限に依存するので、プログラムもファイルを読み取ることができるようにする必要があると述べました。コンテンツが許可されると、「Hello World」がコンソールに印刷されます。 .ファイルの内容は ですecho Hello World
。
これで、プログラムがファイルを読み取ることができ、プログラムが「Hello World」をコンソールに印刷できるようになり、ファイルの内容を調べます。ただecho Hello World
ファイルの内容が次のような場合はどうですか? 、「Hello World」をコンソールに印刷します。
わかりましたが、それでははいつまり、「説明」実装するファイルを送信すると、私はすべての段階でそれを行うことができますことに同意しました!
これがここで起こっていることです。シェルは単にテキストファイルを読み込みます。これは、テキストファイルに読み取り権限があるため許可されます。そしてシェルテキストファイルのコマンドが実行されています。これは許可されます。シェル実行権限があります。