Использование expect для входа на сервер Amazon с помощью .Файл PEM

#ssh #amazon-ec2 #amazon-web-services #expect #pem

#ssh #amazon-ec2 #amazon-веб-сервисы #ожидать #pem

Вопрос:

Мне нужно сделать следующее:

  • Войдите на мой сервер amazon
  • Перейдите в определенный каталог и запустите скрипт
  • Скрипт выполняет svn up , мне нужно иметь возможность передать свое имя пользователя и пароль этому скрипту.

Я читал, что мог бы сделать это с помощью expect? Могу ли я выполнить вход с помощью сценария оболочки, а затем вызвать expect для запуска пользовательского сценария?

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

Комментарии:

1. Это возможно с помощью expect , а также других инструментов, таких fabric , как модуль python. Ожидайте руководство: tcl.tk/man/expect5.31 , документ Python fabric: docs.fabfile.org/en/1.3.2/index.html

2. Спасибо — Намного проще, чем я думал. Вот код, если он кому-нибудь пригодится. Запустив ssh в verbose, я могу быть уверен, что соединение открыто достаточно долго для запуска скрипта. #!/usr/bin/expect set timeout -1 spawn ssh -vi key.pem user@server.com "cd /to/my/script amp;amp; run deploy" expect "username:" send "userr" expect "password:" send "passwordr" expect "Exit status"

3. Обычно я бы создал оболочку, а затем проделал все волшебство.

Ответ №1:

Вы можете использовать ssh для передачи команд оболочки, которые будут выполняться на удаленном экземпляре.

Например, вот как я проверяю журналы на нескольких серверах:

 #!/bin/bash
nas_servers=(
  "ec2-xx-xx-xxx-xxx.ap-xxxx.compute.amazonaws.com"
  "ec2-xx-xx-xxx-xxx.ap-xxxx.compute.amazonaws.com"
  "ec2-xx-xx-xxx-xxx.ap-xxxx.compute.amazonaws.com"
  "ec2-xx-xx-xxx-xxx.ap-xxxx.compute.amazonaws.com"
)

for s in "${nas_servers[@]}"
do
  echo "Cheking $s:"
  ret=$(ssh -i ~/pem/Key.pem "user@$s" bash << 'EOF'
  files=/var/log/syslog*
  for f in $files
  do
if [[ ${f##*.} = 'gz' ]]; then
  cmd=zcat
else
  cmd=cat
fi
$cmd $f | egrep -wi 'error|warn|crit|fail'
  done
EOF
)
  if [[ -z $ret ]]; then
echo "No errors found."
  else
echo "$ret"
  fi
done