【打包構建】Mac下使用expect實現執行sudo命令時自動輸入密碼

一、簡介

  最近想在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
請尊重別人的勞動成果,讓分享成爲一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章