ホームフォルダにfoo.sh
というスクリプトがあります。sudoを使用しているときにコマンドが見つかりません
私はこのフォルダに移動し、./foo.sh
を入力すると、私は
-bash: ./foo.sh: Permission denied
を取得します。
私はsudo ./foo.sh
を使用する場合、私は
sudo: foo.sh: command not found
を取得します。
なぜこれが起こり、どのように修正できますか?
ホームフォルダにfoo.sh
というスクリプトがあります。sudoを使用しているときにコマンドが見つかりません
私はこのフォルダに移動し、./foo.sh
を入力すると、私は
-bash: ./foo.sh: Permission denied
を取得します。
私はsudo ./foo.sh
を使用する場合、私は
sudo: foo.sh: command not found
を取得します。
なぜこれが起こり、どのように修正できますか?
に確認してください許可は、ファイルが実行許可ビットがを設定しておく必要があり、スクリプトを実行するためには
を否定しました。
Linux file permissionsを完全に理解するには、chmod
コマンドのドキュメントを調べることができます。 chmodは、の変更モードの省略形で、ファイルのアクセス許可設定を変更するコマンドです。
ローカルシステムのchmodのマニュアルを読むには、コマンドラインからman chmod
またはinfo chmod
を実行してください。一度読んで、あなたは...
ls -l foo.sh
を実行しているの出力を理解することができるはず理解... READを一覧表示されますされ、ファイルの所有者の権限を書き込み、実行、グループ所有者とある皆ファイルの所有者またはグループのメンバーでないファイルが所属する(つまり、最後の許可グループは時々「世界」または「その他」と呼ばれている)
ここアクセス許可が拒否されましたエラーのトラブルシューティング方法の概要を示しますあなたの場合。
$ 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
^^^
foo.shは限りLinuxが懸念している今、実行可能です。あなたが効果的にスーパーユーザーまたはrootとして、それを実行しているsudoを使ってコマンドを実行すると、コマンドで
、sudoを使用して結果が
が見つかりません。
rootユーザーがあなたのコマンドを見つけていないことを理由は、ルートのPATH
環境変数がfoo.sh
がに位置していますディレクトリが含まれていない可能性が高いです。したがって、コマンドは見つかりません。
PATH環境変数には、コマンドを検索するディレクトリのリストが含まれています。各ユーザーは、必要に応じてPATH変数を設定します。ここでsudoの
[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
注意を使用してrootユーザーとして最初に通常のユーザーとして、その後、上記env
のコマンドを実行しているいくつかのサンプル出力はいるが、ことだ
env | grep ^PATH
を実行するように設定されているかを確認する 同様の場合、PATHに含まれる非特権ユーザー(rkielty)とスーパーユーザーのディレクトリはで、同じではないです。
foo.sh
が存在するディレクトリがrootユーザーのPATH変数に存在しないため、コマンドが見つかりませんエラー。 sudoの
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
上SECURE_PATHため
chmod +x foo.sh
#!/bin/sh
かそのようなものであることを確認します。sudo pwd
チェック$PATH
は使用visudo
をオーバーライドして、私は今のところ、ここで見てきた他のソリューションは、いくつかのシステムに基づいています/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
ありがとう!それはコマンドを実行できないsudoの謎を解くのに役立ちました。 –
を編集している場合実際にはsudo
に現在のPATH
(env
コマンドを使用)を使用することが可能です。ちょうどそれを呼び出すことによって、(-E
オプション付き)環境の残りの部分:実際には
sudo -E env "PATH=$PATH" <command> [arguments]
、1はそれからエイリアスを作ることができます。
alias mysudo='sudo -E env "PATH=$PATH"'
(それは名前を付けることも可能ですエイリアス自体sudo
、元のファイルを置き換えてsudo
)
私はこのソリューションが気に入っています、Tom、あなたは意識的に別のsudo呼び出しで作業しているからです。 PATH変数がどのような方法で使用されているか(そして多くの場合)、設定されていることに注意することが重要です。 –
私はこれがUbuntuディストリビューションに直面した 'command not found'問題のための正しい、最も標準化された解決策だと信じています。ありがとう。 –
明示的にファイルへのパスを指定しても、Linuxは「コマンドが見つかりません」と表示されるようです。
[[email protected] ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[[email protected] ~]$ chmod +x /tmp/uid.sh
[[email protected] ~]$ 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
Voila! これで、sudoで独自のスクリプトを実行したり、毎回PATH = $ PATH:/ home/your_user/binにエクスポートすることなく、ROOTとして設定することができます。私はスーパーユーザーのHOMEので、私のPATHを追加するときに、明示的である必要はあり
お知らせ/ルートにある
あなたはまた、スーパーユーザーにディレクトリのいずれか(例えば/usr/local/bin
)でスクリプトへのソフトリンクを作成することができますパス。それから、sudoが利用できるようになります。
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
はソフトリンクを置くためのディレクトリのアイデアを持っているthis answerを見てください。
あなたは上記のガイドに問題がある場合はchmod u+x foo.sh
の代わりchmod +x foo.sh
を試してみてください。これは他の解決策がなかったとき私のために働いた。
'sudo $ PWD/temp.sh'はうまくいかず、' sudo echo $ PWD'は私が待っていたものだけを示しています。 (Mac) – Nakilon
@ Nakilonあなたが詳しいことを質問に入れておけば、それ以上のトラブルシューティングができるはずです。この問題は、どのシェル(最初のコマンドシェルまたはsudoによって起動されたシェル)が$ PWD –
@RobKieltyを評価した可能性があります。私は正確な問題は覚えていませんが、おそらくスクリプト内の1つのコマンドに対してchmod -xを設定しないようにしていて、sudo経由でスクリプトを呼び出すのがエラーメッセージではありません。 – Nakilon