foo.sh
ホームフォルダーで呼び出されるスクリプトがあります。
このフォルダに移動して と入力する./foo.sh
と、
-bash: ./foo.sh: Permission denied
.
を使用するsudo ./foo.sh
と、
sudo: foo.sh: command not found
.
なぜこれが起こり、どうすれば修正できますか?
アクセス拒否
スクリプトを実行するには、ファイルに実行許可ビットが設定されている必要があります。
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.sh
root ユーザーの PATH 変数に存在しないため、コマンドが見つからないというエラーが発生します。
ここでこれまで見てきた他のソリューションは、いくつかのシステム定義に基づいていますが、実際には、それを正しく呼び出すだけでsudo
、現在の環境 (コマンドを使用PATH
)env
および/または残りの環境 (オプションを使用) を使用することができます。 -E
:
sudo -E env "PATH=$PATH" <command> [arguments]
実際、それからエイリアスを作成できます。
alias mysudo='sudo -E env "PATH=$PATH"'
sudo
(元のを置き換えて、エイリアス自体に名前を付けることもできsudo
ます。)
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
chmod +x foo.sh
#!/bin/sh
またはそのようなものであることを確認してください。sudo pwd
/usr/local/bin
スーパー ユーザー PATH のいずれかのディレクトリ (たとえば) にスクリプトへのソフト リンクを作成することもできます。その後、sudo で使用できるようになります。
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
この回答を見て、ソフトリンクを配置するディレクトリを確認してください。
これが私の解決策です: ~/.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 を追加するときは明示的に指定する必要があることに注意してください。