LINUX.ORG.RU

Выполнение локального скрипта на удаленной машине средствами Expect, Bash, SSH - Bash

 , ,


0

1

Странствую, как старец по форумам в поисках смысла.

Есть задача, выполнить небольшой скрипт, используя expect, на удаленных машинах. Соединение ssh с машинами проходит средствами expect в автоматическом режиме. Какой командой заставить expect исполнить скрипт на удаленной машине? Сам скрипт должен находится на машине с которой идем по ssh.

Суть в том, что при помощи nmap создается список ip-адресов и циклом идет соединение с ними. Соединился, запустил скрипт, отсоединился и т.д. пока не закончится список.

expect_enter()
{
     cat <<EOF
        set timeout 10
        spawn ssh -t root@${IP[$i-1]} \'bash -s\' < /usr/sbin/repo_add
        expect "(yes/no)?*" {send "yes\r"}
        expect "* password:" {send "$PASSW\r"}
        expect "#"       
EOF
}
 
echo "Выполняется обновление хостов"
          for ((i=1; i <= IPL; i ++))
             do
              expect -c "$(expect_enter)"
          done

Вот таким образом происходит часть процесса, касающаяся соединения по ssh. Файл со скриптом, который необходимо выполнить, данный скрипт пытается увидеть уже на удаленной машине, вместо того что бы взять его с машины источника соединения.

Мне лень вникать в скрипт, поэтому просто общие соображения.
1. Помимо expect есть более дружелюбный autoexpect
2. Способы запуска скрипта
a)

cat script.sh | ssh remotehost /bin/bash

b)
ssh user@host <<'ENDSSH'
commands 
ENDSSH

zolden ★★★★★ ()

А не проще настроить авторизацию по ключам?

legolegs ★★★★★ ()

данный скрипт пытается увидеть уже на удаленной машине

Потому что tcl не реагирует на < , а тупо передает ssh'у как еще один параметр

Вобщем много косяков у тебя от непонимания expect'a, а мне лень разжевывать

futurama ★★★ ()

При наличие dsh и sshpass все делается в одну строку и работает параллельно, т.е. быстрее.

dsh -i -c -M -f hosts.list -r 'sshpass' -o '-pPASSWORDHERE' 'bash -s' < /usr/sbin/repo_add

futurama ★★★ ()

судя по ответам, простого решения нет. временно использую scp для копирования скрипта на удаленную машину, а параллельно продолжу изучать expect в поисках более элегантного решения.

ragnatulagan ()
Ответ на: комментарий от ragnatulagan

к сожалению таких утилит не имеется

поставь

apt-get install sshpass dsh

futurama ★★★ ()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от ragnatulagan

судя по ответам, простого решения нет.

просто никому не надо, а ты tcl не хочешь учить

futurama ★★★ ()

А я бы упростил задачу. Сначала копировал бы или создал скрипт на удаленной машине. Потом выполнил бы его. Затем удалил.

rumgot ★★★★★ ()

автор темы явно имеет проблему XY (The XY Problem)

а первый комментарий показывает всё что нужно для решения

anonymous ()

Всем спасибо за советы, но вопрос был в том, как запустить скрипт используя expect, а не НЕ используя expect. По итогу просто добавил копирование скрипта.

ragnatulagan ()
Ответ на: комментарий от anonymous

Вам одному почему то вопрос не понятен. Попробуйте прочитать ещё раз.

ragnatulagan ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.