當前位置: 首頁>>技術教程>>正文


如何在後台運行需要密碼輸入的sudo命令?

, , , ,

問題描述

我最近禁用了sudo的身份驗證緩存功能,現在它每次都會提示我輸入密碼。

雖然這對安全性有好處,但它引起了一個我無法找到解決方案的小問題,我無法運行以下命令:

sudo <command> &

在此之前我會運行一個sudo命令,它會緩存我的密碼並允許我在接下來的幾分鍾內沒有提示運行sudo命令,因此它允許我運行命令。但是當我現在運行它時,因為它之前沒有緩存,並且它立即啟動一個新線程並且sudo甚至沒有提示我輸入密碼,我無法以這種方式運行它。

因此,除非我之前運行sudo -i,否則我無法以這種格式運行命令,這種格式變得相當煩人。所以我想知道是否有辦法繞過這個並仍然以這種方式運行程序和命令?

我正在使用GNOME 3.18運行Ubuntu GNOME 15.10,特別是我想以這種方式運行的程序是etherape,如果這有什麽不同,但我真的希望該解決方案適用於所有程序和命令。

最佳解決方法

而不是在後台運行sudo,告訴sudo在後台運行命令。來自man sudo

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

例如:

sudo -b sleep 10

另一種方法是使用shell來運行命令:

sudo sh -c 'sleep 10 &'

另一種選擇是指定用於獲取密碼的圖形程序,並將sudo發送到後台:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Askpass程序通常用於SSH。其中一個由ssh-askpass-gnome軟件包提供,默認安裝在軟件包中,至少在Ubuntu 15.10上。

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

次佳解決方法

如果您願意將timestamp_timeout至少設置為0.02(1.2秒,我認為和0一樣安全)在/etc/sudoers中(在您的情況下需要,但是使用默認設置或timestamp_timeout設置為除0之外的任何一個)可能隻是執行以下操作),你可以在~/.bashrc中設置一個這樣的別名,這不需要你在運行命令之前記住做某事,這將允許你保持對進程的控製:

alias sudo='sudo -v; [ $? ] && sudo'

這裏的技巧是分號,它將首先分別對Bash解析sudo -v,對用戶進行身份驗證,並將潛在的後台部分限製為[ $? ] && sudo命令,該命令將檢查sudo -v是否成功並再次運行sudo(可能背景)以防萬一它是。

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

第三種解決方法

你不能。 &立即將命令發送到後台。也就是說,在後台創建一個子shell,並在那裏執行命令。當該命令發出提示時(如sudo的情況),提示將顯示在後台,您永遠不會看到它。

唯一的方法是將命令帶回前台,提供密碼並將其發送回後台。例如:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

現在,輸入您的密碼,點擊Enter然後點擊Ctrl Z將其發送回後台,然後點擊bg告訴它繼續運行。

一種更簡單的方法是永遠不要使用&,而是在啟動後用Ctrl Zbg手動將作業發送到後台。

最後,您可能需要考慮將sudo的密碼超時設置為1或2秒。這仍然會給你足夠的安全性(除非你試圖防範Flash)並允許你按預期運行這樣的命令。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/6873.html,未經允許,請勿轉載。