1. ホーム
  2. linux

[解決済み] sudo使用時にコマンドが見つからない

2022-03-01 15:51:56

質問

というスクリプトがあります。 foo.sh をホームフォルダに保存しています。

このフォルダに移動して、次のように入力します。 ./foo.sh となります。

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

を使用する場合 sudo ./foo.sh となります。

sudo: foo.sh: command not found .

なぜこのような現象が起こるのか、どうすれば直るのか。

解決方法は?

パーミッションが拒否されました

スクリプトを実行するには、そのファイルに 実行可能なパーミッションビットの設定 .

Linuxを完全に理解するために ファイルパーミッション のドキュメントを勉強することができます。 chmod コマンドを使用します。 chmod の省略形である 変更モード は、ファイルの権限設定を変更するためのコマンドです。

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

ls -l foo.sh

... これは、ファイル所有者、グループ所有者、およびファイル所有者またはファイルが属するグループのメンバー以外のすべての人の READ、WRITE、EXECUTE パーミッションをリストします(この最後のパーミッション グループは "world" または "other" と呼ばれることがあります)。

のトラブルシューティングの方法をまとめます。 パーミッション拒否のエラー をご覧ください。

$ 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に関する限り、実行可能になりました。

sudoを使用するとCommand not foundが表示される

を使用してコマンドを実行した場合 sudo は、事実上スーパーユーザーまたはルートとして実行することになります。

ルートユーザーがあなたのコマンドを見つけられない理由は、おそらく 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 はルートユーザーのPATH変数に存在しないので、そのため コマンドが見つかりません というエラーが発生します。