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

Ожидание сценария ожидания команды зависания

У меня есть сценарий ожидания, встроенный в сценарий 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 введите пароль один раз, и он сохранит ваш разблокированный ключ в памяти для последующего входа в систему без ввода пароля.