使用 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 配置都會重設路徑。以下是解決此問題的兩種常見方法,第一種是永久更改,第二種是 sudo 的命令列參數(您可以將其新增為別名)。

永久性和全球性的變化

/etc/sudoers需要修改兩個設定:

sudo visudo

在 sudoers 檔案中,預設會呼叫一個設置,Default env_reset該設定會從 sudo 呼叫者 shell 中清除環境設置,即使使用 -E(保留環境)呼叫 sudo 也是如此。

在檔案中尋找名為 的設定env_keep。這決定了允許將哪些環境變數傳遞到使用 sudo 創建的根環境中。預設 sudoers 檔案中通常有一系列 env_keep="xxx" 和 env_keep+="xxx" 語句。預設情況下,PATH 不是允許通過的環境變數之一。

將 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 不使用您的路徑,並且不運行 root 的 bashrc 或等效檔案。看https://askubuntu.com/q/128413以獲得完整的描述。

相關內容