回答:
アクセス拒否
スクリプトを実行するには、ファイルに実行許可ビットが設定されている必要があります。
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変数に存在しないため、コマンドが見つかりませんというエラーが発生します。
sudo
のPATH
ユーザーのと同じ?
これまでに見てきた他のソリューションはいくつかのシステム定義に基づいていますが、実際にそれを呼び出すだけでsudo
、現在のPATH
(env
コマンドで)および/または残りの環境(-E
オプションで)を使用することが可能です:
sudo -E env "PATH=$PATH" <command> [arguments]
実際、それからエイリアスを作ることができます:
alias mysudo='sudo -E env "PATH=$PATH"'
(元の名前をsudo
置き換えて、エイリアス自体に名前を付けることもできsudo
ます。)
command not found
Ubuntuディストリビューションで直面する問題に対する正しい、最も標準化されたソリューションであると私は信じています。ありがとう。
./bashrc
に追加して、セッション間で保存することができます
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
/usr/local/bin
スーパーユーザーPATH のディレクトリ(たとえば)の1つにスクリプトへのソフトリンクを作成することもできます。その後、sudoで使用できるようになります。
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
見ていこの回答にソフトリンクを置くディレクトリのアイデアを持っているが。
ファイルへのパスを明示的に指定しても、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
これはやや誤解を招くエラーですが、おそらく技術的には正しいものです。ファイルは、その実行可能ファイルになるまでコマンドではないため、見つかりません。
これは私の解決策です:〜/ .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を追加するときは明示的にする必要があることに注意してください。
上記のガイドに問題chmod u+x foo.sh
があるchmod +x foo.sh
場合は、代わりに試してください。他の解決策がうまくいかなかったとき、これは私のために働きました。