sudoの使用時にコマンドが見つかりません


145

foo.shホームフォルダーにスクリプトが呼び出されています。

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

-bash: ./foo.sh: Permission denied

を使用するとsudo ./foo.sh

sudo: foo.sh: command not found

なぜこれが起こり、どうすれば修正できるのですか?

回答:


151

アクセス拒否

スクリプトを実行するには、ファイルに実行許可ビットが設定されいる必要があります

Linux ファイルの権限を完全に理解するために、chmodコマンドのドキュメントを調べることができますchmodは、change modeの略で、ファイルの権限設定を変更するために使用されるコマンドです。

ローカルシステムのchmodのドキュメントを読むには、コマンドラインから、man chmodまたはinfo chmodから実行します。読んで理解したら、runningの出力を理解できるはずです...

ls -l foo.sh

...ファイルの所有者、グループの所有者、およびファイルの所有者またはファイルが属するグループのメンバーではない他のすべてのユーザーの読み取り、書き込み、および実行権限を一覧表示します(最後の権限グループが参照されることもあります) 「世界」または「その他」として)

ここでは、あなたのケースにおけるPermission Deniedエラーのトラブルシューティング方法の概要を示します。

$ 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
   ^  ^  ^

Linuxに関する限り、foo.shが実行可能になりました。

sudoを使用するとコマンドが見つからない

sudoを使用してコマンドを実行すると、スーパーユーザーまたはrootとして効果的に実行されます。

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

PATH環境変数には、コマンドを検索するディレクトリのリストが含まれています。各ユーザーは、必要に応じて独自のPATH変数を設定します。実行するように設定されているものを確認するには

env | grep ^PATH

上記のenvコマンドを最初に通常のユーザーとして実行し、次にsudoを使用してrootユーザーとして実行した場合のサンプル出力を次に示します。

rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

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

同様ですが、この場合、PATHに含まれるディレクトリは、非特権ユーザー(rkielty)とスーパーユーザーは同じではありません

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


1
@Nakilonあなたがそれを完全な詳細で質問に入れれば、私はあなたのためにそれをトラブルシューティングできるはずです。問題はおそらく、どのシェル(最初のコマンドシェルまたはsudoによって起動されたシェル)が$ PWDを評価したかです
Rob Kielty

6
@Rob:そうどのようにワンメイクsudoPATHユーザーのと同じ?
トム

1
@Rob:その間に道を見つけました(以下の私の答えを参照してください)。
トム

1
私はあなたが説明した方法が好きです!ありがとう:)
Kasparov92

1
@Tomは/ etc / sudoersのsecure_pathを変更できます
DennisLi

97

これまでに見てきた他のソリューションはいくつかのシステム定義に基づいていますが、実際にそれを呼び出すだけでsudo、現在のPATHenvコマンドで)および/または残りの環境(-Eオプションで)を使用することが可能です:

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

実際、それからエイリアスを作ることができます:

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

(元の名前をsudo置き換えて、エイリアス自体に名前を付けることもできsudoます。)


3
トム、あなたは意識的に別のsudo呼び出しで作業しているので、この解決策が好きです。PATH変数がどのように設定されていても(そして多くの方法で)常に使用されているPATH変数に注意することが重要です。
Rob Kielty、2015

4
これは、command not foundUbuntuディストリビューションで直面する問題に対する正しい、最も標準化されたソリューションであると私は信じています。ありがとう。
Omar Tariq 2016年

エイリアスを自分./bashrcに追加して、セッション間で保存することができます
George

18

sudoのsecure_pathを確認します

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

$PATHオーバーライドされている場合は、使用visudoして編集します/etc/sudoers

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

ありがとう!これは、sudoがコマンドを実行できないという謎を解決するのに役立ちました。
Evgeny Goldin

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

5

/usr/local/binスーパーユーザーPATH のディレクトリ(たとえば)の1つにスクリプトへのソフトリンクを作成することもできます。その後、sudoで使用できるようになります。

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

見ていこの回答にソフトリンクを置くディレクトリのアイデアを持っているが。


2

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

[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ 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

出来上がり!これで、毎回エクスポートPATH = $ PATH:/ home / your_user / binを実行しなくても、sudoを使用して独自のスクリプトを実行したり、ROOTとして設定したりできます。

スーパーユーザーのHOMEは/ rootなので、PATHを追加するときは明示的にする必要があることに注意してください。


1

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


1

上記の優れた答えがあります。それらを試した後も、command not foundファイルパス全体を使用して再試行する場合:

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