Intereting Posts
как сделать файл вредоносного ПО доступным для чтения с помощью «Нет разрешения на чтение в файле» на linux ext-4? Монетный двор – не удается войти в «домашний каталог …» Out-of-the-box CentOS в VirtualBox (NAT): сеть недоступна как принудительно кодировать символы сценария оболочки из сценария Удалить пользователя ldap Команда CLI для захвата области с задержкой? Как смотреть фильмы / изображения без X? curl написать http-код для stderr или в файл как построить с make так, чтобы только измененные файлы получили сборку Поиск всех пакетов программного обеспечения в Debian, которые предоставляют конкретную альтернативу Htaccess – сопоставить динамический URL-запрос к статическому файлу Как `du` только пространство, израсходованное файлами, которые не привязаны в другом месте? Невозможно установить loop-aes-utils на debian 8.0 Как удалить файл с именем –help? awk переменная как регулярное выражение

Как я могу вызвать запрос на кодовую фразу ssh key во время выполнения скрипта?

В моем файле ssh_config имеется несколько записей для сайтов на одном сервере, таких как:

Host site1 HostName 123.1.1.1 User myuser Port 13245 GSSAPIAuthentication no IdentityFile /home/myuser/.ssh/id_dsa Host site2... 

Я использую ключ с защитой парольной фразы, чтобы войти на удаленный сервер, и это работает нормально. Тем не менее, я пытаюсь создать некоторые скрипты bash, которые синхронизируют файлы с помощью rsync, и хотел бы, чтобы сценарий запрашивал мне парольную фразу и затем выполнял команду rsync. ssh-agent кажется тем, что я хочу использовать, но мне трудно понять это. Я ищу что-то вроде …

 HOST="site1:" SRC=/var/foo DEST=/home/bar SYNC=(rsync "$SRC" "$HOST""$DEST"...)# rsync /var/foo site1:/home/bar... read -r -p "Are you sure? [y/N] " response response=${response,,} if [[ $response =~ ^(yes|y)$ ]] then #check to see if the passphrase exists from prior execution of this script. if [ no ];then #use ssh-add to prompt for passphrase ssh-add #? ; #then execute rsync command "${SYNC[@]}" else #execute rsync command "${SYNC[@]}" fi else echo "Operation aborted!" fi 

Единственные примеры, которые я смог найти, либо предложить код, можно разместить в .bashrc или .profile, что заставляет меня вводить кодовую фразу каждый раз, когда я запускаю оболочку или создаю файл ожидания, в котором хранится кодовая фраза, ни одна из которых я не хочу делать. Как я могу получить подсказку для кодовой фразы только один раз, когда я запускаю свой скрипт rsync, чтобы я мог переключать хосты и перезапускать сценарий, как в моем примере.

Сначала вы можете проверить, запущен ли ssh-agent и запустить его, если нет:

 if ! [ -n "$SSH_AUTH_SOCK" ] || ! { ssh-add -l &>/dev/null; rc=$?; [ "$rc" -eq 0 ] || [ "$rc" -eq 1 ];}; then echo "Starting agent..." eval "$(ssh-agent -s)" fi 

ssh-add -l выходит с кодом 1, если нет идентификаторов и с кодом 2, если он не может подключиться к ssh-agent .

Затем вы добавляете кодовую фразу для ключа, который вам нужен.

 ssh-add ~/path/to/keyfile 

Идея ssh-agent заключается в том, чтобы иметь запущенную службу, хранящую все ваши ключи. Поэтому вам нужно только ввести пароль один раз, и вы даже можете перенаправить свой агент на удаленный хост, если вы хотите войти на второй хост оттуда.

Сначала убедитесь, что ssh-agent запущен с использованием ssh-add -l , который, вероятно, говорит: «У агента нет идентификаторов».

Во-вторых, вы добавляете ключи к вашему агенту, говоря ssh-add или ssh-add path/to/key/file .

После этого rsync, как и любая другая команда, использующая ssh, просто использует агент для извлечения ключа, необходимого для удаленного подключения.