web-dev-qa-db-ja.com

ユーザーはどのようにして許可なしにファイルを実行できますか?

"Hello World"をエコーするBashスクリプトを作成しました。 adduserを使用して、テストユーザーbobも作成しました。

lsで示されるように、そのファイルを実行する権限は誰にもありません。

$ ls -l hello.sh 
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh

上記からわかるように、ファイルの所有者はgeorgeで、読み取りと書き込みのアクセス権のみがあり、実行アクセス権はありません。しかし、georgeとしてログインします。スクリプトを直接実行できます。

$ . hello.sh 
Hello World

さらに悪いことに、私はbobとしてログインします。ここでは、読み取り権限しかありませんが、ファイルを実行することはできます。

$ su bob
Password: 
$ . /home/george/testdir/hello.sh 
Hello World

どうしたの?

11
Themelis

あなたの例では、ファイルを実行するのではなく、ソーシングします。

実行は

$ ./hello.sh

そのためには、実行許可が必要です。この場合、スクリプトファイルのコマンドが実行されるサブシェルが開かれます。

ソーシング、つまり.

$ . hello.sh

(間にスペースあり)のみreadsファイル、および. hello.shコマンドを呼び出したシェルを読み取ります次に、読み取りとして直接、つまりサブシェルを開かずにコマンドを実行します。ファイルは読み取り専用であるため、操作には読み取り権限で十分です。 (また、そのようなスクリプトファイル名を指定するとPATH検索が呼び出されるため、PATHに別のhello.shがある場合は注意してくださいthatがソースになります!. ./hello.shのように明示的なパスを使用して、「正しいパス」を確実にソースします。

これを回避するには、スクリプトを使用していないユーザーの読み取りアクセス許可も削除する必要があります。 これはとにかく合理的ですスクリプトの不正使用に本当に懸念がある場合、

  • 許可されていないユーザーは、スクリプトのコンテンツを新しいファイルにコピーアンドペーストするだけで、実行権限が不足していることを簡単に回避できます。
  • kusalanandaが指摘したように、それ以外の場合は、権限のないユーザーがを介して呼び出すことで、スクリプトを快適に使用できます。
    sh ./hello.sh
    
    の代わりに
    ./hello.sh
    
    これには、スクリプトファイルに対する読み取り権限のみが必要なため( this answer などを参照)。

一般的な注意として、スクリプトのソースと実行の間には微妙な違いがあることに注意してください( この質問を参照) 例)。

27
AdminBee

実行許可は、このファイルが実行されるである可能性があることを単に意味します。ただし、ソース(. hello.shまたはsource hello.sh)を使用する場合、またはシェルインタープリターに引数として渡す場合(sh hello.sh)、ファイルを実行していないため、別のコマンド(.またはsh)を実行し、そのコマンドに引数としてファイルを渡す

したがって、あなたの質問に答えるために、. hello.shでファイルを「実行」できるのは、cat hello.shを実行できるのと同じ理由です。あなたはただreadingファイルであり、それを実行します。

説明する:

$ 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または.を使用して、スクリプトを完全に読み取ることができます。

12
terdon

非常に短いバージョンは次のとおりです。あなたは実行中ファイルではありません。あなたはreadingそれをシェルに入れ、シェルがそれを実行します。

some言語インタープリターは、実行を要求されているファイルの実行権限を確認し、ユーザーに適切な権限がない場合は実行を拒否することに注意してください。ただし、これはその特定のインタープリターの作成者による完全な裁量によるチェックであり、オペレーティングシステムによって強制されません。

ちょっと考えて実験してみましょう。

ifプログラムに実行権限がある場合は、このプログラムの実行を許可する必要があります。このプログラムが文字列 "Hello World"をコンソールに出力することを許可する必要があることにも同意できると思います。

さらに、ファイルが読み取り権限を持っている限り、プログラムがファイルを読み取ることができるはずであることにも同意できるでしょう。そして、そのファイルの内容が何であるかは問題ではありません。ファイルに読み取り許可ビットが設定されている限り、プログラムはそれを読み取ることができます。

プログラムに "Hello World"をコンソールに出力することを許可することに同意し、プログラムにファイルの読み取りを許可することに同意したので、プログラムに次のことを許可することに論理的に同意する必要があります。ファイルを読み取りますandコンソールに「Hello World」を出力します。また、プログラムがファイルの読み取りを許可されるかどうかは、コンテンツではなくアクセス許可に依存するため、ファイルの読み取りと「Hello World」をコンソールに出力することも許可する必要があると述べましたファイルのecho Hello Worldです。

ここで、プログラムがファイルを読み取ることが許可されており、プログラムが "Hello World"をコンソールに出力できるため、ファイルの内容をチェックすることも許可されていることにも同意できますかonlyファイルの内容がecho Hello World?の場合、「Hello World」をコンソールに出力します

さて、しかしそれからis "interpreting"、言い換えればexecutingファイル、そしてあなたはそれが許可されるべき方法のすべてのステップで私に同意しましたそれを行う!

そしてそれがまさにここで起こっていることです。シェルは単にテキストファイルを読み取っていますが、テキストファイルには読み取りアクセス許可があるため、これを行うことができます。そしてthe Shellはテキストファイル内の命令を実行していますが、これはthe Shellに実行権限があるため許可されています。

5
Jörg W Mittag