Я пытаюсь автоматизировать развертывание некоторых пакетов .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 ответ1

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 там.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .