secure_path を確認してください sudo で
[[email protected] ~]# 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
許可が拒否されました
スクリプトを実行するには、ファイルに実行許可ビットが設定されている必要があります .
Linux ファイルのパーミッションを完全に理解するには、chmod
のドキュメントを参照してください。 指図。 chmod、モード変更の略語 、ファイルの許可設定を変更するために使用されるコマンドです。
ローカル システムの 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 ユーザーがコマンドを見つけられない理由は、おそらく PATH
root の環境変数に、foo.sh
があるディレクトリが含まれていません .したがって、コマンドが見つかりません。
PATH 環境変数には、コマンドを検索するディレクトリのリストが含まれています。各ユーザーは、必要に応じて独自の PATH 変数を設定します。実行するように設定されている内容を確認するには
env | grep ^PATH
上記の env
を実行した場合の出力例を次に示します。 最初に通常のユーザーとしてコマンドを実行し、次に sudo を使用して root ユーザーとしてコマンドを実行します
[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
似ていますが、この場合、非特権ユーザー (rkielty) とスーパー ユーザーの PATH に含まれるディレクトリは同じではないことに注意してください。 .
foo.sh
があるディレクトリ root ユーザーの PATH 変数に存在しないため、コマンドが見つかりません エラーです。
ここまで見てきた他のソリューションは、いくつかのシステム定義に基づいていますが、実際には sudo
を持つことができます 現在の PATH
を使用 (env
コマンド) および/または残りの環境 (-E
を使用) オプション) 正しく呼び出すだけです:
sudo -E env "PATH=$PATH" <command> [arguments]
実際、それからエイリアスを作成できます:
alias mysudo='sudo -E env "PATH=$PATH"'
(エイリアス自体に sudo
という名前を付けることもできます 、元の sudo
を置き換えます .)