Мне необходимо развернуть некоторые файлы с сервера A на сервер B. Я подключаюсь к серверу A через SSH и оттуда подключаюсь через ssh к серверу B, используя закрытый ключ, хранящийся на сервере A, открытый ключ которого находится в файле author_keys сервера B. Соединение от A до B происходит в сценарии оболочки Bash, который находится на сервере A.
Это все работает хорошо, красиво и просто, пока администратор, заботящийся о безопасности, не указал, что мой закрытый ключ SSH, хранящийся на сервере A, не защищен парольной фразой, так что любой, кто может взломать мою учетную запись на сервере A, также получит доступ к серверу B, а также C, D, E, F и G. У него есть точка, я думаю.
Он предлагает сложный сценарий, при котором я бы добавил фразу-пароль, а затем изменил сценарий оболочки, добавив в начале строку, в которой я бы назвал
ssh-keygen -p -f {private key file}
ответьте на приглашение для моей старой парольной фразы с помощью ключевой фразы и (два) запроса на мою новую парольную фразу с помощью только возврата, который удаляет парольную фразу, а затем в конце, после моей команды scp
звонит
ssh-keygen -p -f {private key file}
снова, чтобы поставить фразу обратно
На что я говорю «Еч!».
Ну, я могу немного улучшить это, сначала прочитав парольную фразу ONCE в скрипте с
read -s PASS_PHRASE
затем предоставляя его по мере необходимости, используя параметры -N и -P ssh-keygen.
Это почти пригодно для использования, но я ненавижу интерактивные подсказки в сценариях оболочки. Я хотел бы свести это к одной интерактивной подсказке, но часть, которая меня убивает, это та часть, где я должен дважды нажать клавишу ввода, чтобы избавиться от ключевой фразы
Это работает из командной строки:
ssh-keygen -p -f {private key file} -P {pass phrase} -N ''
но не из сценария оболочки. Там, похоже, я должен удалить параметр -N и согласиться с необходимостью ввести два возврата.
Это лучшее, что я могу сделать. Кто-нибудь может улучшить это? Или есть лучший способ справиться с этим? Я не могу поверить, что нет.
Лучше всего было бы как-то безопасно справиться с этим без необходимости вводить парольную фразу, но это может потребовать слишком много. Я бы согласился на один вызов сценария.
Вот упрощенная версия всего скрипта в виде скелета
#! /bin/sh
KEYFILE=$HOME/.ssh/id_dsa
PASSPHRASE=''
unset_passphrase() {
# params
# oldpassword keyfile
echo "unset_key_password()"
cmd="ssh-keygen -p -P $1 -N '' -f $2"
echo "$cmd"
$cmd
echo
}
reset_passphrase() {
# params
# oldpassword keyfile
echo "reset_key_password()"
cmd="ssh-keygen -p -N '$1' -f $2"
echo "$cmd"
$cmd
echo
}
echo "Enter passphrase:"
read -s PASSPHRASE
unset_passphrase $PASSPHRASE $KEYFILE
# do something with ssh
reset_passphrase $PASSPHRASE $KEYFILE