Bash脚本中的SSH + Sudo + Expect:在远程机器中使用sudo运行命令


0

我试图使用脚本自动部署一些.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(这不是真的)

......在这一点上,我的想法用完了...... :-)

任何提示将不胜感激。谢谢。


Answers:


1

我用于类似问题的是将所有远程脚本放入文件中/usr/local/bin/debinstall.sh。在你的情况下我的建议是:有一个特殊的目录,你把包丢弃 - 让我们称之为/tmp/remoteinstall一个例子。此外,将您连接的用户放入/etc/suduers文件中,并允许它在sudo dpkg -i *不提示输入密码的情况下执行。debinstall.sh那会是这样的:

#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *

使此脚本由和拥有chmod 744 /usr/local/bin/debinstall.sh

在本地,您的工作只是上传您的.deb文件并调用脚本:

cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh

debinstall.sh然后将安装您的包,然后仅在安装成功完成后清空目录。

如果遗漏了某些内容$PATH,请记住这两种情况.bashrc都不.profile执行 - 因此您可能希望在远程脚本的开头处获取它们,或者在那里定义适当的PATH。


事实证明,“[sudo] \”选项中的括号是搞乱的。我终于让它与产卵区一起工作了:spawn / usr / bin / ssh -t zignage @ $ remoteMachine \“/ usr / bin / sudo / usr / bin / dpkg -i / home / zignage / Documents / $ debToInstall \“并在sudo中删除大括号(\”\ [sudo \] \“)
BorrajaX

很高兴看到你已经解决了!在这种情况下,你的变体的优点是只需要在一台机器上进行维护;)
Izzy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.