sudo でカスタム スクリプトを実行 - コマンドが見つかりません

sudo でカスタム スクリプトを実行 - コマンドが見つかりません

問題:

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_resetsudoers ファイルには、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詳しい説明についてはこちらをご覧ください。

関連情報