Назад | Перейти на главную страницу

Сохранение сеанса SSH в сценарии bash

У меня есть сценарий bash, который перебирает список серверов, запускает пару удаленных команд через SSH и записывает вывод этих команд в локальный файл. Для каждой команды, выполняемой на удаленном сервере, я открываю новый сеанс SSH. Есть ли способ, чтобы только один сеанс SSH оставался открытым для сервера, и что я мог запускать несколько команд, вывод которых я мог перенаправить в локальный файл?

Вы хотите заглянуть в ControlMaster настройка для SSH. Это позволяет вам создать одно SSH-соединение, а затем подключить все остальные SSH-соединения к тому же серверу, мультиплексирующему через это одно соединение. Очень кстати.

Чтобы расширить возможности использования 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

Это в значительной степени не проверено, но должно дать вам правильное общее представление.

Инструмент "expect" также может делать то, что вы хотите, но требует написания tcl.

Примечание. Когда вы говорите «локальный файл», я не уверен, что вы имеете в виду локальный компьютер, на который вы только что установили ssh, или если вы имеете в виду локальный для машины, запускает сеанс ssh.

Толкать против тяни:
Похоже, это не тот инструмент, может быть, вы просто хотите использовать cron на каждой локальной машине? Если требуется информация от мастера, вы можете попросить задание cron получить файл с сервера. Это был бы больше метод вытягивания, 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"

автоматически передает строку в кавычках через удаленную оболочку. Однако остерегайтесь правил цитирования оболочки!