Bash
Bash 腳本中的 SSH + Sudo + Expect:在遠端機器中使用 sudo 執行命令
我正在嘗試使用腳本自動部署一些 .deb 包。我想
sudo dpkg -i $myDeb.deb
在可以使用 ssh 訪問的遠端電腦列表中執行。我嘗試在 bash 腳本中使用 ’expect’ 自動執行命令,但顯然我做錯了,因為我得到了許多不同的錯誤(基本上取決於我在哪裡加上引號)
這是我擁有的功能(將被呼叫類似:
_remoteInstallation "myPackage115.deb" "192.168.1.55"
。我知道在遠端機器中,.deb 將位於 $HOME/Documents/ 中:function _remoteInstallation(){ local retval=1 local debToInstall=$(basename "$1") local remoteMachine="$2" spawned=$(expect -d -c " set timeout 1800 spawn "/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall"' expect { \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue } \"password\" { send \"myPassword\r\"; exp_continue } \"[sudo] password\" { send \"myPassword\r\"; exp_continue } default { exit 1 } } " ) retval=$? return $retval }
有了這樣的生成區域中的引號,我得到了
expect: invalid option -- 't'
如果我將其更改為:
spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'
看起來正在嘗試在本地執行 sudo dpkg 命令(首先 ssh(s) 到 ‘$remoteMachine’,然後在本地執行 sudo dpkg,就像兩個單獨的命令一樣)
有了這個:
spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''
我明白了
couldn't execute "'/usr/bin/ssh": no such file or directory
(這不是真的)…在這一點上,我沒有想法了… :-)
任何提示將不勝感激。謝謝你。
我認為您錯過了一定程度的引號轉義。在這種高級別的轉義下,最好為每個需要引用的階段簡單地製作一個小腳本。
否則,您可以嘗試這個修改後的版本(但請注意,我不鼓勵這種編碼風格!)
function _remoteInstallation(){ local retval=1 local debToInstall=$(basename "$1") local remoteMachine="$2" spawned=$(expect -d -c " set timeout 1800 spawn \"/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\" expect { \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue } \"password\" { send \"myPassword\r\"; exp_continue } \"[sudo] password\" { send \"myPassword\r\"; exp_continue } default { exit 1 } } " ) retval=$? return $retval }