У меня есть сценарий ожидания, встроенный в сценарий bash:
#! /bin/bash
# this function runs a command like 'ssh' and provides the password
function with_password {
expect << END
spawn $2
expect *assword:*
send -- $1
interact
wait
END
}
# run "long_running_command" on the remote server
with_password my_password "ssh my_user@some-server long_running_command"
# rsync some data to the remote server
with_password my_password "rsync /some/dir my_user@some-server:/remote/dir"
# run some other random command
with_password my_password "ssh my_user@some-server some_other_command"
Проблема в том, что иногда скрипт зависает в ожидании порожденной команды. Если я уйду wait
вне ожидаемого сценария, команда продолжит выполнение на удаленном сервере, но сценарий bash будет продолжать работу, и у меня нет возможности узнать, когда он завершится.
Почему мой ожидаемый сценарий зависает случайным образом?
В interact
команда в expect
здесь-док была проблема. Вместо этого мне нужно было дождаться EOF:
#! /bin/bash
# this function runs a command like 'ssh' and provides the password
function with_password {
expect << END
set timeout 900
spawn $2
expect *assword:*
send -- $1
expect EOF
END
}
# run "long_running_command" on the remote server
with_password my_password "ssh my_user@some-server long_running_command"
# rsync some data to the remote server
with_password my_password "rsync /some/dir my_user@some-server:/remote/dir"
# run some other random command
with_password my_password "ssh my_user@some-server some_other_command"
В interact
Иногда кажется, что команда работает, когда команда ssh / rsync закрыла ввод в нужное время (возможно?), но это было ненадежно.
Здесь отсутствует последний разделитель документов.
expect << END
spawn $2
expect *assword:*
send -- $1
interact
wait
END
Как насчет использования входа без пароля с ключами ssh?
Вы можете создать свои ключи с помощью ssh-keygen
затем поместите свой открытый ключ на удаленный конец: ~/.ssh/authorized_keys
.
Вы даже можете создавать ключи с помощью кодовая фраза (если вы хотите добавить какую-то безопасность), которую вы можете загрузить в свою оболочку с помощью ssh-agent bash
введите пароль один раз, и он сохранит ваш разблокированный ключ в памяти для последующего входа в систему без ввода пароля.