
問題:
sudoとしてスクリプトを実行すると、
sudo: mount-remove-hiberfile: command not found
情報:
スクリプト フォルダ: '/scripts' (すべてのカスタム スクリプトはここに保存されます)
私のユーザー: 'cybex'
cybex@cybex-W55xEU:~$ echo $PATH // および 'sudo echo $PATH' は同じパスを返します
/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/bin:/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts:/snap/bin
root@cybex-W55xEU:/home/cybex# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts
スクリプト「mount-remove-hiberfile」は通常のユーザーでは実行できないため、 を実行する必要がありますsudo mount-remove-hiberfile
。
sudo がこのスクリプトを検出しないのはなぜですか?
注: これに関していくつかの質問を見つけましたが、私の質問に答えるものはありませんでした
アップデート
ls -l /scripts/
total 20
-rwxr-xr-x 1 root root 95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root 40 Apr 26 22:45 apt-update
-rwxr-xr-x 1 root root 769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root 370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile
更新 (コマンドとエラーとディレクトリを含む貼り付けを含める)
cybex@cybex-W55xEU:~$ pwd
/home/cybex
cybex@cybex-W55xEU:~$ ls -l /scripts/
total 52
-rwxr-xr-x 1 root root 95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root 2283 May 21 16:59 backup
-rwxr-xr-x 1 root root 109 May 21 16:59 check-port
-rwxr-xr-x 1 root root 2185 May 21 16:59 connected
-rwxr-xr-x 1 root root 769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root 164 May 21 16:59 download
-rwxr-xr-x 1 root root 370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 5142 May 21 16:59 firewall
-rwxr-xr-x 1 root root 3881 May 21 16:59 firewall.save
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile
-rwxr-xr-x 1 root root 80 May 21 16:59 portquiz
-rwxr-xr-x 1 root root 84 May 21 16:59 space-used
drwxr-xr-x 1 root root 0 May 21 17:00 tmp
cybex@cybex-W55xEU:~$ sudo mount-remove-hiberfile
sudo: mount-remove-hiberfile: command not found
答え1
デフォルトでは、sudo の設定により、sudo の呼び出し方法に関係なくパスがリセットされます。この問題を回避する一般的な方法は 2 つあります。1 つ目は永続的な変更、2 つ目は sudo へのコマンド ライン引数 (エイリアスとして追加可能) です。
恒久的かつ地球規模の変化
/etc/sudoers
次の 2 つの設定を変更する必要があります。
sudo visudo
Default env_reset
sudoers ファイルには、sudo が -E (環境を保持) で呼び出された場合でも、sudo 呼び出し元のシェルから環境設定をクリアする という設定がデフォルトで存在します。
ファイル内で、 という設定を探しますenv_keep
。これは、sudo で作成されたルート環境に渡すことができる環境変数を決定します。通常、デフォルトの sudoers ファイルには、一連の env_keep="xxx" および env_keep+="xxx" ステートメントがあります。デフォルトでは、PATH は通過が許可される環境変数の 1 つではありません。
これらのエントリの 1 つに PATH を追加するか、env_reset 行をコメント アウトします。env_keep エントリがない場合は、その後にDefaults env_reset
新しいエントリを探して追加します。env_keep = "PATH"
次に、PATH 変数が sudo env に渡されるようにしたとしても、sudoers では設定によってパスが制限されます。Defaults secure_path='...'
この設定をコメント アウトするか、スクリプトがあるパスをエントリに追加することができます。
その後、sudo は PATH 変数を維持し、スクリプトを実行します。
コマンドラインの回避策
sudoers ファイルの変更を回避するには、次の構文で sudo を呼び出すことができます。
sudo env "PATH=$PATH" <script name>
答え2
sudoはデフォルトではパスを使用せず、ルートのbashrcまたは同等のものを実行しません。https://askubuntu.com/q/128413詳しい説明についてはこちらをご覧ください。