実務上で困ったことがあるわけではなく、すごく興味本位なものですが、
手元の OpenBSD システムでは、パーミッションが 100(--x------) でオーナーは自分であるシェルスクリプト、例えば内容は簡単に
#!/bin/sh
echo test
といったものを(編集は root 権限で行ったとして)、
$ ./XXX
test
として実行することができます。
しかし翻って手元の Ubuntu (Linux) で同じ条件で実行しようとすると
$ ./XXX
/bin/sh: Can't open ./test
と、 shebang 中のインタプリタがファイルをオープンできない旨が表示されました。
この違いについて調べたいのですが、どこから検索したものかわからず、質問してみました。そもそもこれが BSD と Linux というレベルの違いによるものかもわかっていなかったりします。
どうぞよろしくおねがいします。
shebang 自体の解釈をどのように行っているかを理解すればいいかな。
#!/bin/sh
ファイルの先頭に shebang がある場合、勝手にそのプログラムが呼ばれるわけではない。
該当のスクリプトの場合以下のように読み替えてから再度実行する形になる。
/bin/sh ./XXX
shebang の記述にファイル名自体を引数として与えると言うことだ。
この為同じコマンドをログインシェルから直接実行したのとほぼ等価。
実行するために実行権限が、引数に与えられたファイルを読み込むために読込権限が必要。
手元の環境で試す限りでは FreeBSD / CentOS の双方において、
となった。
読み書き、実行とも同じユーザーで実行した結果だ。
Ubuntu での実行の仕方自体に違いがあるのでは?
sudo /bin/bash
とかやってから実行すると結果が変わるかもしれない。
読み込み権限が無ければ実行権限があっても実行できない
・OpenBSD root権限は完全に開放されていてパーミッションを無視して読み取り可能
・Ubuntu rootでのログインが規制されておりsudoによる実行しかできないためパーミッションを無視できない
あ…、なるほど!
OpenBSD の場合、 root として実行しなくても実行時に何らかの root への権限委譲が発生して、
実際には root として普通に読み取りに行っているだけだ、というわけですね!?
ありがとうございます。もう少し色々試して考えてみます。
Linuxの/bin/shの正体がbashだから
ありがとうございます。やられました。そうでした。
シェルレベルの話なのかカーネルレベルの話なのかまだ釈然としていないのですが、
ヒントをありがとうございます。そうでした…。
(追記)しかも Ubuntu の場合は "dash" ですもんね…。全く失念しておりました。ありがとうございました。
echo "test"
と引用符をつけないと。
え!?
と一瞬思いましたが、さすがに一単語ですし、クォート無しでも大丈夫でした。
有り無しで挙動も変わらないようです。ほっ…。
shebang 自体の解釈をどのように行っているかを理解すればいいかな。
#!/bin/sh
ファイルの先頭に shebang がある場合、勝手にそのプログラムが呼ばれるわけではない。
該当のスクリプトの場合以下のように読み替えてから再度実行する形になる。
/bin/sh ./XXX
shebang の記述にファイル名自体を引数として与えると言うことだ。
この為同じコマンドをログインシェルから直接実行したのとほぼ等価。
実行するために実行権限が、引数に与えられたファイルを読み込むために読込権限が必要。
手元の環境で試す限りでは FreeBSD / CentOS の双方において、
となった。
読み書き、実行とも同じユーザーで実行した結果だ。
Ubuntu での実行の仕方自体に違いがあるのでは?
sudo /bin/bash
とかやってから実行すると結果が変わるかもしれない。
実際に動作確認までしていただいて、ありがとうございます!
・shebang がどう処理されているかを理解することから取りかかる
・"この為同じコマンドをログインシェルから直接実行したのとほぼ等価。"
とてもためになりました。実際に shebang でいくつか検索してみたところ、さらに自分の理解も深まりました。
仮想環境に FreeBSD や NetBSD も入れて、自分の手でももう少し試してみます。本当にありがとうございます。
(追記)
FreeBSD および CentOS でも試してみました。
(インタプリタが実行する)スクリプトファイルのパーミッションを 100 とした場合の所有者による実行は、Ubuntu 同様不可能でした。
再度試しましたが、 OpenBSD ではこれが可能です。ご教示いただいた流れで shebang について色々検索しまして、
http://www.in-ulm.de/~mascheck/various/shebang/
こちらに、 OpenBSD/NetBSD 系ではファイルディスクリプタをカーネルが開いた状態でインタプリタに渡してあげる仕様があるようで、
そのためではないかと考えています。
示唆いただいて本当に助かりました。自分としてはこれで腑に落ちましたので質問を終了させてください。
みなさまどうもありがとうございました。
実際に動作確認までしていただいて、ありがとうございます!
・shebang がどう処理されているかを理解することから取りかかる
・"この為同じコマンドをログインシェルから直接実行したのとほぼ等価。"
とてもためになりました。実際に shebang でいくつか検索してみたところ、さらに自分の理解も深まりました。
仮想環境に FreeBSD や NetBSD も入れて、自分の手でももう少し試してみます。本当にありがとうございます。
(追記)
FreeBSD および CentOS でも試してみました。
(インタプリタが実行する)スクリプトファイルのパーミッションを 100 とした場合の所有者による実行は、Ubuntu 同様不可能でした。
再度試しましたが、 OpenBSD ではこれが可能です。ご教示いただいた流れで shebang について色々検索しまして、
http://www.in-ulm.de/~mascheck/various/shebang/
こちらに、 OpenBSD/NetBSD 系ではファイルディスクリプタをカーネルが開いた状態でインタプリタに渡してあげる仕様があるようで、
そのためではないかと考えています。
示唆いただいて本当に助かりました。自分としてはこれで腑に落ちましたので質問を終了させてください。
みなさまどうもありがとうございました。