人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

シェルスクリプトの実行の BSD と Linux の違い(?)について質問です。

実務上で困ったことがあるわけではなく、すごく興味本位なものですが、
手元の OpenBSD システムでは、パーミッションが 100(--x------) でオーナーは自分であるシェルスクリプト、例えば内容は簡単に

#!/bin/sh
echo test

といったものを(編集は root 権限で行ったとして)、

$ ./XXX
test

として実行することができます。

しかし翻って手元の Ubuntu (Linux) で同じ条件で実行しようとすると

$ ./XXX
/bin/sh: Can't open ./test

と、 shebang 中のインタプリタがファイルをオープンできない旨が表示されました。

この違いについて調べたいのですが、どこから検索したものかわからず、質問してみました。そもそもこれが BSD と Linux というレベルの違いによるものかもわかっていなかったりします。
どうぞよろしくおねがいします。


●質問者: oogatta
●カテゴリ:コンピュータ
✍キーワード:/bin/sh BSD echo Linux open
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● koriki-kozou
●30ポイント

読み込み権限が無ければ実行権限があっても実行できない

・OpenBSD root権限は完全に開放されていてパーミッションを無視して読み取り可能

・Ubuntu rootでのログインが規制されておりsudoによる実行しかできないためパーミッションを無視できない

◎質問者からの返答

あ…、なるほど!

OpenBSD の場合、 root として実行しなくても実行時に何らかの root への権限委譲が発生して、

実際には root として普通に読み取りに行っているだけだ、というわけですね!?

ありがとうございます。もう少し色々試して考えてみます。


2 ● tama213
●20ポイント

Linuxの/bin/shの正体がbashだから

◎質問者からの返答

ありがとうございます。やられました。そうでした。

シェルレベルの話なのかカーネルレベルの話なのかまだ釈然としていないのですが、

ヒントをありがとうございます。そうでした…。

(追記)しかも Ubuntu の場合は "dash" ですもんね…。全く失念しておりました。ありがとうございました。


3 ● kick_m
●10ポイント

echo "test"

と引用符をつけないと。

◎質問者からの返答

え!?

と一瞬思いましたが、さすがに一単語ですし、クォート無しでも大丈夫でした。

有り無しで挙動も変わらないようです。ほっ…。


4 ● kick_m
●10ポイント

だから実行できないわけでしょ。

◎質問者からの返答

読み込み権限を与えてあげれば、実行はできるんです…。


5 ● b-wind
●70ポイント ベストアンサー

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 系ではファイルディスクリプタをカーネルが開いた状態でインタプリタに渡してあげる仕様があるようで、

そのためではないかと考えています。

示唆いただいて本当に助かりました。自分としてはこれで腑に落ちましたので質問を終了させてください。

みなさまどうもありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ