#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.html2. Спасибо — Намного проще, чем я думал. Вот код, если он кому-нибудь пригодится. Запустив 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