Bash

Bash 腳本中的 SSH + Sudo + Expect:在遠端機器中使用 sudo 執行命令

  • July 3, 2012

我正在嘗試使用腳本自動部署一些 .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
}

引用自:https://unix.stackexchange.com/questions/42252