問題:
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
PDATE(コマンドとエラーおよびディレクトリを含む貼り付けを含む)
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
デフォルトでは、Sudo構成は、Sudoの呼び出し方法に関係なくパスをリセットします。これを回避する2つの一般的な方法を次に示します。1つは永続的な変更、2つ目はSudoへのコマンドライン引数です(エイリアスとして追加できます)。
/etc/sudoers
では、次の2つの設定を変更する必要があります。
Sudo visudo
Sudoersファイルには、デフォルトでDefault env_reset
という設定があり、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に渡されることを許可した場合でも、パスはDefaults secure_path='...'
の設定によってsudoersで制限されます。この設定をコメントアウトするか、スクリプトが含まれるパスをエントリに追加できます。
その後、SudoはPATH変数を維持し、スクリプトを実行します。
Sudoersファイルの変更を回避するために、次の構文でSudoを呼び出すことができます。
Sudo env "PATH=$PATH" <script name>
Sudoは、デフォルトではパスを使用せず、rootのbashrcまたは同等のものを実行しません。詳細な説明については、 https://askubuntu.com/q/12841 を参照してください。