SSH + Sudo + Expect в скрипте Bash: запустить команду с sudo на удаленном компьютере
Я пытаюсь автоматизировать развертывание некоторых пакетов.deb с помощью скрипта. Я хочу выполнить sudo dpkg -i $myDeb.deb
в списке удаленных машин я могу получить доступ с помощью SSH.
Я пытался автоматизировать команду с помощью команды "предвидеть" в скрипте bash, но, очевидно, я делаю что-то не так, потому что получаю несколько разных ошибок (в основном, в зависимости от того, где я поставил кавычки)
Это функция, которую я имею (будет вызываться с чем-то вроде: _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
(что не соответствует действительности)
... и в этот момент у меня кончились идеи... :-)
Любая подсказка будет оценена. Спасибо.
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 там.