2012-06-27 4 views
3

Я пытаюсь достичь следующих с Баш скрипт:Удаленный SSH и выполнение команд с помощью BASH и Ожидать

  1. попытки для подключения SSH, если не удается, ошибка, если SSH соединение
  2. раз подтвердил выполните команду «сверху» и сохранить результаты в файл
  3. Scp файл обратно с удаленного сервера

Я знаю invidiual команды, которая будет: 1), чтобы проверить соединение SSH:

ssh -q [email protected] exit 

echo $?

Это должно возвращать '0' на успех и '255' об ошибке.

2) для выполнения верхней и сохранить файл будет:

top -n 1 -b > /tmp/top.out 

3) ПКПП назад файл с удаленного хоста

expect -c " 
    set timeout 1 
    spawn scp [email protected]:/tmp/top.out [email protected]:/. 
    expect yes/no { send yes\r ; exp_continue } 
    expect password: { send password\r } 
    expect 100% 
    sleep 1 
    exit 
" 

Теперь положить это вообще моя проблема, чтобы быть более конкретным :

  • Возможно, я не могу получить возвращаемые значения «0» и «255» при использовании ожидающих tes t соединение SCP.

    • Я не могу показаться, чтобы быть в состоянии выполнить верхнюю команду, используя ожидать снова, то это не работает:

    ожидать -c " Тайм-аут 1 икру SSH пользователь @ хост сверху -n 3 -b> /tmp/top.out ожидать пароль: {отправить пароль \ г} сна 1 выхода "

    • и поэтому третий бит не прист k.

Любая помощь приветствуется. Пожалуйста, имейте в виду, что мой скрипт является сценарием .sh с объявлением #!/Bin/bash. Я не могу использовать #!/Usr/bin/expect по различным причинам.

+0

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

+1

Это именно так, как это делается в моей компании, это не моя ошибка, поэтому я просто пытаюсь извлечь максимум из этого. – Tamas

ответ

4

Теперь это уродливые вещи. Есть много подводных камней, возможно, вы не совсем уверены, в каких местах вы работаете с оболочкой или с простым массивом argv. Также ожидаемый материал не тот путь , что должно быть сделано, это только хрупкое.

(AFAIK, expect в основном предназначен для связи с модемами (набор команд AT) и т.п.).

Используйте SSH ключи для автоматических ssh и scp вместо паролей.После того, как вы сделали это (или даже раньше, но тогда вы должны ввести пароль вручную), запустить это в оболочке:

$ ssh [email protected] "top -n 1 -b" > /tmp/top.out 

и файл будет находиться на вашем местного машины. (Поскольку перенаправление было выполнено локально, еще не удаленно). Нет необходимости в scp.

Это все, что нужно.

0

Проверьте это: https://stackoverflow.com/a/23632210/524743

expect <<'END' 
log_user 0 
spawn sh -c {echo hello; exit 42} 
expect eof 
puts $expect_out(buffer) 

lassign [wait] pid spawnid os_error_flag value 

if {$os_error_flag == 0} { 
    puts "exit status: $value" 
} else { 
    puts "errno: $value" 
} 
END 

hello 

exit status: 42 

Из ожидать человека страницы

Подождать [арг]

задержки до тех пор, порожденного процесса (или текущего процесса, если ни один назван) завершается.

wait обычно возвращает список из четырех целых чисел. Первое целое число - это pid процесса, который ожидался. Второе целое число - это соответствующий идентификатор нереста. Третье целое число равно -1, если произошла ошибка операционной системы , или 0 в противном случае. Если третье целое число равно 0, четвертое целое является статусом, возвращаемым порожденным процессом . Если третье целое было равным -1, четвертым целым является значение errno, установленное операционной системой. Глобальная переменная errorCode - также установлена.

+1

Хотя эта ссылка может ответить на вопрос, лучше включить части ответа здесь и укажите ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

@MauricioGracia Исправлено, спасибо :) – Samuel

Смежные вопросы