
Я пытаюсь автоматизировать развертывание некоторых пакетов .deb с помощью скрипта. Я хочу выполнить его sudo dpkg -i $myDeb.deb
в списке удаленных машин, к которым я могу получить доступ по ssh.
Я пытался автоматизировать команду с помощью «expect» внутри скрипта 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.