Сохранение сессии SSH в bash-скрипте
У меня есть скрипт bash, который перебирает список серверов, запускает пару удаленных команд через SSH и записывает вывод этих команд в локальный файл. Для каждой команды, которую я запускаю на удаленном сервере, я открываю новый сеанс SSH. Есть ли способ, что только один сеанс SSH остается открытым для сервера, и что я могу запустить несколько команд, вывод которых я могу перенаправить в локальный файл?
5 ответов
Вы хотите посмотреть в ControlMaster
настройка для SSH. Это позволяет вам создать одно SSH-соединение, а затем иметь все другие SSH-соединения с одним и тем же сервером, мультиплексировать через это одно соединение. Очень кстати.
Инструмент "ожидается" также может делать то, что вы хотите, но включает в себя написание tcl.
Чтобы расширить использование ControlMaster, вот чуть более конкретный пример:
CONTROL=/tmp/ssh-control-`date +%s`-$RANDOM
ssh -o BatchMode=yes -NfM -S $CONTROL &
MASTERPID=$?
ssh -o BatchMode=yes -S $CONTROL user@host command1 > outfile1
ssh -o BatchMode=yes -S $CONTROL user@host command2 > outfile2
kill $MASTERPID
Это в основном не проверено, но оно должно дать вам правильную общую идею.
Примечание. Когда вы говорите "локальный файл", я не уверен, имеете ли вы в виду локальный компьютер, на котором вы только что установили ssh'd, или если вы имеете в виду локальный для компьютера, запускает сеанс ssh.
Push против Pull:
Похоже, это не тот инструмент, может быть, вы просто хотите использовать cron на каждой локальной машине? Если информация требуется от мастера, вы можете сделать так, чтобы задание cron получало файл с сервера. Это был бы скорее метод pull, ssh - это то, что я бы назвал методом push. Я не могу сказать, что лучше для вашей ситуации, но об этом можно подумать.
Выполнить несколько команд:
Я не понимаю, хотите ли вы держать сеанс открытым для каждого изменения нескольких команд или просто держать его всегда открытым. Если это первое, вы можете просто использовать точки с запятой между командами или &&, чтобы следующая команда выполнялась только в том случае, если первая работает. Например:
#bar echoed only if foo exists and can be read
ssh myServer 'cat foo && echo bar'
ssh myServer 'cat foo; echo bar'
Вы также можете сделать что-то вроде следующего, если хотите указать использование вещей в оболочке:
ssh myServer "bash -c 'cat foo && echo bar'"
Наконец, вы всегда можете просто разместить скрипт на каждом сервере и просто запустить его.
Вы можете запустить несколько команд последовательно, запустив оболочку в удаленной системе и передав ей команды:
ssh server "echo this is; all in one session"
будет автоматически передавать строку в кавычках через удаленную оболочку. Остерегайтесь правил цитирования оболочки, хотя!