
Для этого объяснения,машинамой ноутбук, и я использую его для подключения к удаленному серверу, который я буду называтьимя сервера.
Процедуру можно описать следующим образом:
- Я подключаюсь к серверуимя серверас
ssh
измашина - Затем я ввожу пароль дляимя сервера
- Я что-то компилирую наимя сервера
- Я выхожу изимя сервера(с использованием
exit
) - Затем я перезагружаюсь.имя сервераотмашина
- я
ping
имя сервераи затем я жду, пока не получу от него ответ (ping
вывод отображается на консоли) - Я
ssh
вимя сервераснова - Я провожу некоторые проверки.
- Наконец,
exit
яимя серверадля того, чтобы вернуться назадмашина
Чтобы выполнить вышеуказанный рецепт, явручнуювыполните следующие команды измашина:
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ cd /some/path/
<server_name>$ make clean > /dev/null
<server_name>$ make > /dev/null
<server_name>$ exit
<machine>$ ./my_reboot_script server_name
<machine>$ ping server_name
PING 10.23.22.7 with 56(84) bytes of data.
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
^C
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ ./run_some_checks
<server_name>$ exit
<machine>$ echo "Done!"
Пара замечаний по вышесказанному:
- my_reboot_script
это всего лишь программа, которая позволяет мне выполнять холодную перезагрузкуимя сервераиз своего собственного сиденья.
- После того, как я сделаю холодную перезагрузкуимя сервера, мне нужно подождать, пока он снова заработает, чтобы я мог снова подключиться к нему с помощью ssh
. Для этого я использую ping
; он просто используется как указание на то, когдаимя сервераснова готов принимать соединения; Только когда я вижу, что ping
вывод наконец появляется на консоли, я прерываю его нажатием Ctrl+C, а затем вхожу ssh
вимя сервера.
Делать это вручную утомительно и занимает много времени. Поэтому я хочу автоматизировать этот процесс, но есть три трудности:
- При подключении кимя сервера, выполнение
exit
команды из оболочки изящно выводит меня из системы и возвращает вмашина. Однако вызовexit
из.sh
файла скрипта завершит выполнение скрипта... - Как я могу автоматизировать пароль дляимя серверафаза? Я не хочу вручную вводить пароль, а предоставлю это сделать скрипту; другими словами - я хочу как-то жестко закодировать пароль в скрипте, чтобы он меня этим не беспокоил.
- Фаза «ожидания готовности сервера к ssh-подключениям»: как это автоматизировать? То есть, вместо того, чтобы просто
ping
ждать ответа, а затем прерывать его с помощью Ctrl+C, я хочуping
, чтобы скрипт распознавал, что есть ответ отимя сервера, затем соединитесь сssh
. Хотя использованиеping
здесь может быть не такой уж хорошей идеей, так как ответ наping
не гарантирует, чтоимя сервераготов к прослушиваниюssh
подключений (из моего опыта с вышеописанным процессом, это занимает еще несколько секунд с моментаping
получения первого ответа на ). Поэтому лучшим подходом может быть, чтобы скрипт продолжал попыткиssh
в цикле, пока не предоставит доступ (некий механизм активного ожидания или даже цикл, который засыпает и просыпается каждые несколько секунд, чтобы попытаться подключиться).
решение1
Если вы можете перенести данные открытого ключа со своего компьютера в файлы сервера .ssh/authorized_key
, вы можете запустить компиляцию с помощью одного ssh
вызова на сервер, даже не вводя пароль:
ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'
Вы можете поместить это в цикл в скрипте оболочки, изменяя значение переменной оболочки SERVER
каждый раз. Если вы не против ввода пароля для каждого ssh
вызова, вам даже не нужны данные открытого ключа на серверах.