題 sudo在一個命令行中使用密碼?


在忙碌的日子裡,我想跑步

$ ./configure && make && sudo make install && halt

在晚上睡覺,希望應用程序將自動安裝。但是我第二天看到的是sudo要求我輸入密碼的屏幕。那麼我如何在一個命令行中使用密碼運行sudo,或者還有其他方法可以執行此操作嗎?


90
2017-11-09 02:37


起源


你需要 halt 以root身份運行。 - Keith Thompson
不 sudo 有15分鐘的超時?你不能跑,比方說, sudo ls 或者類似的東西,輸入你的密碼,然後運行上面的命令 sudo 特權仍然活躍? (我現在無法測試這個,否則我會將此作為答案發布。) - Matt
超時 sudo 是可配置的。注重安全的人(也就像我一樣偏執狂)將其設為零... :-) - dda
另見 提示輸入sudo密碼並以編程方式提升bash腳本中的權限?, 如何在需要sudo的bash腳本中只輸入一次密碼, 從腳本中請求root權限, 在腳本中創建一個沒有密碼提示的sudo用戶..., 如何提示用戶輸入sudo密碼?等等 - jww


答案:


是的,使用 -S 從STDIN讀取密碼的開關:

$echo <password> | sudo -S <command>

所以對於你的情況,它看起來像這樣:

$./configure && make && echo <password> | sudo -S make install && halt

當然,更換 <password> 用你的密碼。


130
2017-11-09 02:47



顯然,如果在shell歷史記錄中有其他人看到密碼的危險,則不希望運行此操作。 - Brett Daniel
尋找在遠程主機上運行特權命令的快速方法,這非常有效。 - nelaaro
如果你決定使用'echo <密碼> | sudo -S'選項,為避免在命令歷史記錄中公開密碼,請使用SPACE字符啟動命令。當然,最好的選擇是從安全文件中管道密碼。 - user224306
如果您在$ VARIABLE中有密碼(例如,您可以使用sops配置),則可能需要使用它 - Natim
9年後,仍然像一個魅力:) - WinEunuuchs2Unix


你也可以配置sudo visudo 允許用戶使用make作為sudo而無需密碼。

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS

9
2017-11-09 03:03





其他幾種解決方案的缺點是它們不必要地運行 ./configure 和 make 作為根。

這有點令人費解,但它應該工作:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

注意使用雙引號來允許 $USER 由(非根)shell擴展。

我也可以添加一個 sleep 60 之前 halt 命令。我有時會做這樣的事情,期望命令運行很長時間,但出現問題並立即終止;該 sleep 讓我在系統關閉之前終止命令。或者你可以使用 shutdown 帶著時間論證。


9
2017-08-08 06:52





您可以用以下命令替換命令行:

$sudo su

$./configure && make && make install && halt

系統將立即提示您輸入密碼,然後其餘命令將以超級用戶身份運行。


8
2017-11-09 03:14



這個的替代(也可能是首選)版本: sudo sh -c "./configure && make && make install && halt" - quack quixote
但是,所有生成的編譯文件都不具備超級用戶權限嗎?這會阻止您以後以普通用戶身份運行./configure&&make。 - user45909
是的,用戶45909,你說得對。我個人從未重新運行./configure && make除了下載主程序包的更新後,但我可能不是典型的。 - CarlF


將HISTIGNORE設為“sudo -S

$ export HISTIGNORE='*sudo -S*'

然後將您的密碼安全地傳遞給sudo:

$ echo "your_password" | sudo -S -k <command>

“HISTIGNORE”表示不將此命令保存到歷史記錄中。那是記憶中的歷史或“〜/ .bash_history”文件。

例如,下面將安全地將您的密碼傳遞給sudo命令,而不是 保留密碼歷史記錄。

“-S”,表示使用stdin作為密碼,

“-k”表示忽略緩存憑據以強制執行sudo 總是問。這是為了保持一致的行為。

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

上述方法的缺點是,如果您想要查看稍後在歷史記錄中運行的命令,它們將不會存在。另一種方法是更新sudo身份驗證憑據緩存(默認啟用5分鐘超時),然後單獨運行sudo。但這樣做的缺點是你需要知道5分鐘的緩存。

例如:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

注意我在每個命令之前運行了一個sudo,以確保更新sudo緩存,因為默認值為5分鐘。是的,whoami不應該花5分鐘,但我想也許在每個命令之前運行它以保持一致性。你也可以把“export HISTIGNORE ='sudo -S在你的〜/ .bashrc文件中,然後用“。”加載它。 〜/ .bashrc“或註銷然後登錄。但是,我正在考慮將其用於腳本編寫目的,因此我會將其保留在我的所有腳本的頂部以獲得最佳安全實踐。設置”echo“”| sudo -S -v“變量也可能是一個好主意,然後只需在每個需要root權限的命令之前運行變量,請參閱Janar的評論。”John T“的評論還應該包含”-k“參數,好像你運行“sudo -S”沒有“-k”和sudo身份驗證緩存已經有你的憑據(並且仍然有效,默認sudo身份驗證緩存是5分鐘)然後bash會將你的密碼作為命令運行,這是壞。


5
2017-11-25 19:43



正如關於在歷史中使事情不可用的小註釋一樣,運行命令時,前面有一個空格。由於某種原因,這導致歷史忽略它。 - Matt Fletcher


如果你想要更加小心,你可以創建一個腳本,更改文件的權限,這樣只有root才能讀取和編輯,然後才能運行它。

例:
1)創建一個文件:

gedit ~/.easy.install  

2)粘貼此並保存:

./configure && make && echo <password> | sudo -S make install && halt  

3)使其可執行:

sudo chmod +x ~/.easy.install  

4)更改文件的權限,以便只有root才能讀取和編輯它:

sudo chmod 700 ~/.easy.install  

5)運行:

~/.easy.install  

請享用 ;-)


2
2018-04-19 23:56



echo <password>仍將顯示在進程列表中,如果有人在恰當的時刻獲得了ps aux的幸運,他們可以以明文形式查看密碼。最好將密碼保存到文件中,並使用<從文件重定向到sudo。 - bobpaul


你也可以這樣做:

sudo -S <<< "password" command

2
2018-06-09 14:15





如果有人碰巧看到sudo不需要您的帳戶密碼,那麼設置這樣的sudo就很危險。除非你知道自己在做什麼,否則不要這樣做。我曾經在我的本地A +培訓計劃中用我的實驗計算機進行過多次... -_-

John T.說的聽起來不錯,除了在shell歷史中仍然存在找到密碼的風險。 CarlF說的聽起來更好,但如果一個命令失敗,計算機仍將以超級用戶權限運行。


1
2017-11-10 03:37





注意,我發現該方法不適用於舊版本的sudo,特別是“Sudo版本1.6.7p5”:

$ echo "<your_password>" | sudo -S -k whoami

這個方法適用於舊版本和新版本的sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami

1
2017-12-08 15:18



這是 不 回答原始問題。要批評或要求作者澄清,請在帖子下方留言 - 您可以隨時評論自己的帖子,一旦有足夠的評論 聲譽 你將能夠 評論任何帖子。 - DavidPostill♦
@Darren DeHaven:你能解釋一下這個問題如何成為這裡提出的問題的答案嗎? - Renju Chandran chingath


就個人而言,我和John T在2009年11月9日凌晨2點47分的回答完全一樣,我也根據他的回答指導我的改進,謝謝。

區別在於我傾向於使用變量,例如:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

這樣我就可以輕鬆地使用我的變量而不是sudo,

$AutoSuDo apt-get update;

這對於一些較長的腳本非常方便。我主要將這些用於其他人的個人計算機,我必須維護。

我還建議關注:

  • desgua回答於2011年4月19日23:56
  • user224306評論於13年5月14日17:38為John T回答於2009年11月9日凌晨2點47分

0
2018-06-29 20:57