スクリプトは実行可能として設定されていなくても実行できますか?


25

スクリプト(.sh)を実行可能として設定されている場合と設定されていない場合で実行できるようです。それで、正確にこれが重要なのはどこですか?

回答:


24

myscript次を含むファイルがあるとしましょう:

#!/bin/bash
echo "Hello, World!"

このファイルを実行可能にし、で実行すると./myscript、カーネルは最初の2バイトが#!であることがわかります。これは、スクリプトファイルであることを意味します。カーネルは、行の残りをインタープリターとして使用し、ファイルを最初の引数として渡します。だから、それは実行されます:

/bin/bash myscript

bashはファイルを読み取り、含まれているコマンドを実行します。

したがって、bash(またはスクリプトに必要なインタープリター)がスクリプトを「実行」するには、ファイルを読み取ることができれば十分です。

したがって、スクリプトの場合、実行ビットを使用すると、実行が少し便利になります。bashが実行可能である限り、スクリプトファイルを引数として常にbashを実行するか、bashを対話形式で実行し、スクリプトを1行ずつ端末にコピーして、コマンドを実行できます。


詳細に説明してくれてありがとう。:)正しく理解できた場合、bashはスクリプトを読み取りアクセスするだけで実行できます。なぜなら、bashはスクリプトを入力として受け取り、読み取るだけで済むからです。そのユーザーのスクリプトの読み取り権限を取得することにより、この動作を停止できます。右?それで、この実行可能な許可はいつ使用され、正確に問題になりますか?
アシュフェイム

はい、「bash myscript」を使用する場合、ユーザーは「myscript」の読み取りアクセス権のみが必要です(bashがパス内にある場合は、もちろん/ bin / bashの実行可能ファイルです)。ただし、スクリプトを実行可能にする場合、状況は少し異なります。カーネルの観点から見ると、最初の行が#!/ bin / bashの場合、再び「/ bin / bash myscript」になりますが、そのポイントに到達するには、最初にスクリプトを実行可能として提示する必要がありますユーザーまたはグループ。ただし、一部のユーザーのスクリプトが実行可能ではないが読み取り可能である場合は、(s)「bash myscript」を使用してスクリプトを「実行」することができます....
LGB

@LGBだからそれはほとんど役に立たない。良いことは、そのスクリプトの読み取り許可をユーザーから切り離すことです。右?
アシュフェイム

@Ashfame:役に立たないというよりも有用だと思います。通常のファイルの実行ビットは、アクセスを制限するために使用されることはありません(意図されていませんでした)。あなたはそれからそれを期待しているようです。バイナリ実行可能ファイルがある場合、それを実行するには実行許可が必要です。ただし、読み取りアクセス権がある場合は、いつでも自分のホームディレクトリにファイルをコピーできます。この場合、コピーは自分が所有するため、実行権限を追加して実行できます。ただし、ディレクトリの場合は、目的が少し異なります。参照してくださいmywiki.wooledge.org/Permissions
geirha

1
正しいインタープリターがわからない場合、/ bin / bashの代わりに何を使用すればよいですか?シェバン行に従ってスクリプトを実行するコマンドはありますか?
アイバー

16

「シェルスクリプトの実行」と「shを使用したシェルスクリプトの実行」を混同しないようにしてください。

これは、次のファイルのアクセス許可の影響を受けませんfile.sh

sh file.sh

実行中sh(プログラムに解決/bin/sh)、file.shコードを読み取って実行します。

スクリプト自体を実際に実行すると、ファイルのアクセス許可が有効になります。

./file.sh

ファイル許可は、FATなどの非Linuxファイルシステムではサポートされていないことに注意してください。そのため、を実行してもchmod -x file.sh、ファイルには以前のアクセス許可が保持されます。

実行許可はファイルシステムによって実施されます。ただし、プログラムはファイルの内容を読み取ることでコードを「実行」することもできます。これにより、「実行」のファイルシステム権限がバイパスされます。


私はあなたの主張を理解しています。しかし、それはグループまたは世界、あるいはその両方のためですか?
アシュフェイム

@Ashfame実行可能権限を設定すると、その権限を持っているユーザーが、グループ、ワールド、所有者のいずれの権限を持っているユーザーであっても、スクリプトを直接実行できます。ただし、実行許可のない人でも、実行を行うために別のプログラム(などbash)を呼び出すことで実行できます。これにより、許可を取り消さなければならないことをブロックできますread
JG-ファウスト

If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisしかし、実行可能権限をチェックすることで、さまざまなユーザーに権限がどのように付与されますか?そして、私はあなたの2番目のポイントを得ました。スクリプトの読み取り許可を取り除いて、bashで処理することさえできないようにするということです。右?
アシュフェイム

@Ashfame読み取り許可ポイントで、はい。方法についてsudo chmod g+x myfile.shは、ターミナルのようなものを呼び出して、ファイルのグループの実行許可を追加します。ファイル許可のチュートリアルを参照してください。複数のユーザーの権限を同時に管理するには、グループを使用します。たとえば、グループの管理を参照してください。
jgファウスト

私が意味したのは、GUIで実行可能な権限を追加したとき、それは誰のためですか?所有者/グループ/世界?
アシュフェイム

1

そのように考えないでください。このファイルを実行できますか?次のように考えてください:誰がこのファイルを実行できますか?

コンピューターがあなたのものであり、ファイルがあなたのものである場合、私はあなたがそれを実行できると確信しています。chmodchownなどのコマンド、およびファイルのアクセス許可をさらに調査することをお勧めします。

それがお役に立てば幸いです。


はい、私はそれらについて知っています。つまり、私(所有者)はいつでも実行できます。右?次に、ファイルを実行可能ファイルとして設定するのは、グループまたはワールド、あるいはその両方ですか?
アシュフェイム

1

ファイルが実行可能でない場合exec、Linuxカーネルのsyscallは失敗しEACCESます

あなたが行うことができますがsh myprog.shなどのプログラムを実行しようと、(単にファイルや解釈をさ読み取る)./myprog.shあなたがそれを行うとき以来、ない仕事ができます:

  • 端末上のBashシェルはexecシステムコールを使用します./myprog.sh
  • シバンは、https://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-onでexec説明されているように、Linuxカーネルのシステムコールによって直接解釈されます-最初の行/ 40938801#40938801
  • Linuxカーネルは、実行許可なしでファイルの実行を拒否します

これは次の方法で確認できますmain.c

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

およびmyprog.sh

#!/bin/sh
echo worked

場合はmyprog.sh、実行可能ではない、mainと失敗します。

execve: Permission denied
13
13

Ubuntu 17.10でテスト済みgcc -std=c99

POSIX 7では次のように言及しています。

次の場合、fexecve()を除くexec関数は失敗します。

[EACCES]新しいプロセスイメージファイルのパスプレフィックスにリストされているディレクトリの検索許可が拒否されているか、新しいプロセスイメージファイルが実行許可を拒否しています。

さらなる根拠は、https//security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-theで見つけることができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.