2012-10-21 21 views
105

ホームフォルダにfoo.shというスクリプトがあります。sudoを使用しているときにコマンドが見つかりません

私はこのフォルダに移動し、./foo.shを入力すると、私は

-bash: ./foo.sh: Permission deniedを取得します。

私はsudo ./foo.shを使用する場合、私は

sudo: foo.sh: command not foundを取得します。

なぜこれが起こり、どのように修正できますか?

答えて

114

に確認してください許可は、ファイルが実行許可ビットがを設定しておく必要があり、スクリプトを実行するためには

を否定しました。

Linux file permissionsを完全に理解するには、chmodコマンドのドキュメントを調べることができます。 chmodは、の変更モードの省略形で、ファイルのアクセス許可設定を変更するコマンドです。

ローカルシステムのchmodのマニュアルを読むには、コマンドラインからman chmodまたはinfo chmodを実行してください。一度読んで、あなたは...

ls -l foo.sh 

を実行しているの出力を理解することができるはず理解... READを一覧表示されますされ、ファイルの所有者の権限を書き込み、実行、グループ所有者とある皆ファイルの所有者またはグループのメンバーでないファイルが所属する(つまり、最後の許可グループは時々「世界」または「その他」と呼ばれている)

ここアクセス許可が拒否されましたエラーのトラブルシューティング方法の概要を示しますあなたの場合。

$ ls -l foo.sh     # Check file permissions of foo 
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
    ^^^ 
^^^ | ^^^ ^^^^^^^ ^^^^^ 
    | | |  |  | 
Owner| World |  | 
    |   | Name of 
    Group  |  Group 
      Name of 
       Owner 

所有者は読み取り、アクセスRWの書き込みが、している - 実行可能権限が

chmodコマンドで修正されるが欠落していることを示しています。 (グループおよびその他のファイルのみに設定されたアクセス権を読んだことが、彼らはそれに書き込むか、それを実行することはできません)

$ chmod +x foo.sh    # The owner can set the executable permission on foo.sh 
$ ls -l foo.sh     # Now we see an x after the rw 
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh 
^^^

foo.shは限りLinuxが懸念している今、実行可能です。あなたが効果的にスーパーユーザーまたはrootとして、それを実行しているsudoを使ってコマンドを実行すると、コマンドで

、sudoを使用して結果が

が見つかりません。

rootユーザーがあなたのコマンドを見つけていないことを理由は、ルートのPATH環境変数がfoo.shがに位置していますディレクトリが含まれていない可能性が高いです。したがって、コマンドは見つかりません。

PATH環境変数には、コマンドを検索するディレクトリのリストが含まれています。各ユーザーは、必要に応じてPATH変数を設定します。ここでsudoの

[email protected]:~$ env | grep ^PATH 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

[email protected]:~$ sudo env | grep ^PATH 
[sudo] password for rkielty: 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin 

注意を使用してrootユーザーとして最初に通常のユーザーとして、その後、上記envのコマンドを実行しているいくつかのサンプル出力はいるが、ことだ

env | grep ^PATH 

を実行するように設定されているかを確認する 同様の場合、PATHに含まれる非特権ユーザー(rkielty)とスーパーユーザーのディレクトリはで、同じではないです。

foo.shが存在するディレクトリがrootユーザーのPATH変数に存在しないため、コマンドが見つかりませんエラー。 sudoの

[[email protected] ~]# sudo -V | grep 'Value to override' 
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin 

SECURE_PATHため

+0

'sudo $ PWD/temp.sh'はうまくいかず、' sudo echo $ PWD'は私が待っていたものだけを示しています。 (Mac) – Nakilon

+0

@ Nakilonあなたが詳しいことを質問に入れておけば、それ以上のトラブルシューティングができるはずです。この問題は、どのシェル(最初のコマンドシェルまたはsudoによって起動されたシェル)が$ PWD –

+0

@RobKieltyを評価した可能性があります。私は正確な問題は覚えていませんが、おそらくスクリプト内の1つのコマンドに対してchmod -xを設定しないようにしていて、sudo経由でスクリプトを呼び出すのがエラーメッセージではありません。 – Nakilon

6
  1. スクリプトに対する実行権限があることを確認してください。すなわちchmod +x foo.sh
  2. スクリプトの最初の行が#!/bin/shかそのようなものであることを確認します。
  3. sudoのディレクトリが間違っています。 sudo pwd
7

チェック$PATHは使用visudoをオーバーライドして、私は今のところ、ここで見てきた他のソリューションは、いくつかのシステムに基づいています/etc/sudoers

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 
+0

ありがとう!それはコマンドを実行できないsudoの謎を解くのに役立ちました。 –

57

を編集している場合実際にはsudoに現在のPATHenvコマンドを使用)を使用することが可能です。ちょうどそれを呼び出すことによって、(-Eオプション付き)環境の残りの部分:実際には

sudo -E env "PATH=$PATH" <command> [arguments] 

、1はそれからエイリアスを作ることができます。

alias mysudo='sudo -E env "PATH=$PATH"' 

(それは名前を付けることも可能ですエイリアス自体sudo、元のファイルを置き換えてsudo

+3

私はこのソリューションが気に入っています、Tom、あなたは意識的に別のsudo呼び出しで作業しているからです。 PATH変数がどのような方法で使用されているか(そして多くの場合)、設定されていることに注意することが重要です。 –

+2

私はこれがUbuntuディストリビューションに直面した 'command not found'問題のための正しい、最も標準化された解決策だと信じています。ありがとう。 –

1

明示的にファイルへのパスを指定しても、Linuxは「コマンドが見つかりません」と表示されるようです。

[[email protected] ~]$ sudo /tmp/uid.sh;echo $? 
sudo: /tmp/uid.sh: command not found 
1 
[[email protected] ~]$ chmod +x /tmp/uid.sh 
[[email protected] ~]$ sudo /tmp/uid.sh;echo $? 
0 

これは多少誤解を招くエラーですが、技術的には間違いはないと思われます。ファイルは、その実行可能ファイルまでコマンドではないので、見つからない。

1

これは私のソリューションです。 〜/。bash_aliasesは次のように追加してください:

# ADDS MY PATH WHEN SET AS ROOT 
if [ $(id -u) = "0" ]; then 
    export PATH=$PATH:/home/your_user/bin 
fi 

Voila! これで、sudoで独自のスクリプトを実行したり、毎回PATH = $ PATH:/ home/your_user/binにエクスポートすることなく、ROOTとして設定することができます。私はスーパーユーザーのHOMEので、私のPATHを追加するときに、明示的である必要はあり

お知らせ/ルートにある

2

あなたはまた、スーパーユーザーにディレクトリのいずれか(例えば/usr/local/bin)でスクリプトへのソフトリンクを作成することができますパス。それから、sudoが利用できるようになります。

chmod +x foo.sh 
sudo ln -s path-to-foo.sh /usr/local/bin/foo 

はソフトリンクを置くためのディレクトリのアイデアを持っているthis answerを見てください。

0

あなたは上記のガイドに問題がある場合はchmod u+x foo.shの代わりchmod +x foo.shを試してみてください。これは他の解決策がなかったとき私のために働いた。

関連する問題