一、簡介
最近想在Jenkins執行Build工作結束後,再執行一些sudo的命令,但是在Mac上sudo命令需要提供密碼才能執行。而Jenkins在執行自動化操作的時候,我們是無法在構建任務中手動輸入密碼的,只有實現了自動輸入sudo密碼才能讓整個構建任務繼續執行下去,要不然就會無限期地卡在等待輸入密碼這一步。
在網上看到過利用管道實現sudo命令自動輸入密碼的方法,我在Mac上試了,並不奏效,估計只能在Linux上運行,代碼如下:
echo "password" | sudo -S commander
後來又看到通過修改/etc/sudoers中的系統配置實現免密執行sudo的方法,但是這種方法也有缺點,一旦修改錯誤的話會造成用戶權限紊亂,導致當前用戶再也無法執行sudo提權的命令了,比較危險。同時修改完以後執行任何命令都不需要sudo了,在安全性控制方面粒度比較大,容易造成隱患。
那麼有沒有一種比較優雅的方式既能實現sudo執行某些命令或者腳本免密,且不需要改動系統配置文件,安全性又較高的方法呢?expect,它來了!
二、利用expect實現執行sudo命令時自動輸入密碼
expect是Mac下的一個軟件包,利用它可以很方便地在自動化流程中實現一些需要交互性的操作,我們直接通過brew就可以很方便地安裝它:
brew install expect
然後我們就可以開始編寫自動化腳本了,比如我想在Jenkins構建結束以後,執行sudo rm -rf ./Build/temp/這樣的清理緩存操作,那我就可以這樣寫:
#autorm.sh
#expect的安裝路徑 #/usr/bin/expect這個路徑安裝完expect之後 which expect可以查看 #!/usr/bin/expect -f #設置超時時間 set timeout 3 #設置你的Mac用戶密碼 set password 123456 #傳遞交互指令 spawn sudo rm -rf ./Build/temp/ #根據輸出傳遞數據,在這裏是等待密碼提示顯示 expect "*asswor*" send "$password\r" #保持在遠端 interact
同樣還可以通過$argv 參數數組傳遞,expect autorm.sh 123456
set password [lindex $argv 0] expect "password" {send "$password\r\r"}
有一點額外注意的是:上面的這個腳本不能當做普通的shell腳本來執行了,如果你在終端下嘗試執行 sh autorm.sh會報錯,得用 expect命令來執行這個特殊的腳本:expect autorm.sh。如果提示沒有權限的話,再執行一下chmod u+x autorm.sh給一下執行權限就可以了。
三、總結
在本篇博客中,馬三爲大家介紹了一種比較優雅的實現Mac下執行sudo命令免密的方法,希望可以幫助到大家!
如果覺得本篇博客對您有幫助,可以掃碼小小地鼓勵下馬三,馬三會寫出更多的好文章,支持微信和支付寶喲!
作者:馬三小夥兒
出處:https://www.cnblogs.com/msxh/p/13567400.html
請尊重別人的勞動成果,讓分享成爲一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!