182

foo.shホームフォルダーで呼び出されるスクリプトがあります。

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

-bash: ./foo.sh: Permission denied.

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

sudo: foo.sh: command not found.

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

4

11 に答える 11

188

アクセス拒否

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

Linuxファイルのパーミッションを完全に理解するには、コマンドのドキュメントを参照してchmodください。chmodはchange modeの略で、ファイルのパーミッション設定を変更するために使用されるコマンドです。

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

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 

所有者には読み取りおよび書き込みアクセス権がありますが、- は実行権限がないことを示します

コマンドはそれ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 の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

似ていますが、この場合、非特権ユーザー (rkielty) とスーパー ユーザーの PATH に含まれるディレクトリは同じではないことに注意してください

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

于 2012-10-21T14:17:13.693 に答える
128

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

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

実際、それからエイリアスを作成できます。

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

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

于 2015-04-01T20:53:16.520 に答える
29

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
于 2013-09-01T16:46:02.700 に答える
6
  1. スクリプトに対する実行権限があることを確認してください。すなわちchmod +x foo.sh
  2. そのスクリプトの最初の行が#!/bin/shまたはそのようなものであることを確認してください。
  3. sudo の場合、間違ったディレクトリにいます。確認するsudo pwd
于 2012-10-21T09:08:22.577 に答える
5

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

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

この回答を見て、ソフトリンクを配置するディレクトリを確認してください。

于 2016-08-20T20:29:41.750 に答える
0

これが私の解決策です: ~/.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 を追加するときは明示的に指定する必要があることに注意してください。

于 2016-06-01T03:56:05.953 に答える