- ベストアンサー
Bシェルにてユーザの実行可否
シェルにてrootユーザのみ実行が出来るようにしたいと思い、以下のようなシェルを書きました。 が、root以外のユーザでも実行が可能となってしまっています。実行する上でシェル、またはシェル以外で影響はあるのでしょうか?ご存知でしたらご教授願います。 ※今回はユーザID:user1で作成+実行しています。 ※このシェルのアクセス権限は"-rwxr--r--"としています。 #!/bin/sh UID=`whoami` if [ $UID -ne root ] then echo "実行はrootのみ" fi -以降、その他の処理が続く-
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問者さんが書かれたスクリプトでは、UIDという変数にユーザ名を格納しています。しかし、$UIDは一般に読取専用の環境変数で、ログインユーザのUIDが格納されています。 UIDとは、各ユーザに固有に割り振られている数値で、/etc/passwd等に記載されています。 さらに、testコマンド([のことです)文字列の比較としては、-neを使うのは実は間違いです。 -eq、-ne、-lt、-le、-gt、-ge これらは、数値を比較する為のオペランドなので、これをもって文字列の比較はできません。恐らくは、このせいでif文全体がエラーになって処理が進んでしまっているものと思われます。 文字列を比較する場合は、 string1 = string2 string1 != string2 こんな感じです。 また、変数を使って文字列を比較する場合、 "string1" = "string2" のようにダブルクォートでくくっておけば、文字列が空になった場合でも、エラーにならずにきちんと比較されます。 質問者さんが行いたいことは、一般的には以下のようにするのが正しいです。 if [ $UID -ne 0 ]; then echo 'This Script can used ROOT only' # 英語はでたらめです。 exit fi UNIX系OSにおいて、rootのUIDは必ず0であることを利用します。 もしくは、 if [ "$USER" != "root" ]; then echo 'This Script can used ROOT only' # 英語はでたらめです。 exit fi $USERが無い場合は、それこそ、whoami等で事前に代入すればOKです。 exitに渡す終了ステータスは、このスクリプトを呼び出した上位アプリが参照することが出来ます。しかし、手動で起動する類のコマンドであれば、大きな意味はありませんので、ステータスを使い分ける必要にせまられたときに考えればよいでしょう。
その他の回答 (2)
- mdebugon
- ベストアンサー率75% (6/8)
Tacosan の回答で全てだと思います。 一般的にエラー処理は if [ エラーの判定 ] then echo "エラーメッセージ" exit 1 fi と、exitでshellの処理を終了する習慣をつけるのがお勧めです。(書き方はいろいろありますけど)
お礼
遅くなって申し訳ありません、 Bシェル・Cシェルとの使い分けや記述に色々戸惑いがありますが、がんばります。 ありがとうございました。 また何かわからないことがあれば質問させてください
補足
回答ありがとうございます。 すみません、"exit 1" と "exit" では何か違うのでしょうか? 知識無ですいませんが教えてください。
- Tacosan
- ベストアンサー率23% (3656/15482)
root をオーナーにしておけばいいのにと思いつつ if [ `whoami` -ne root ]; then echo "実行はrootのみ" else 実際の処理 fi としないとダメなのでは?
お礼
遅くなって申し訳ありません、教えて頂きありがとうございました。 次回また何かわからないことがあれば質問させてください。
補足
早速の回答ありがとうございます。 if [ `whoami` -ne root ]; then ←わざわざ変数に入れなくてもこれでいいのでしたね。ありがとうございます。それと、すいません、一部記述間違いました。 echo "実行はrootのみ" exit としています。これならroot以外で実行したらシェルが終わると思ったので。
お礼
遅くなって申し訳ありません、回答していただいたとおり、-ne -eqでは無理でした。ありがとうございました。 また何かわからないことがあれば質問させてください。