2016-09-01 3 views
1

Я сочинительство скрипт, и я хочу, чтобы автоматизировать вход в удаленную машину с помощью SSH-копии идентификатор, поэтому вручную при печати:автоответа SSH-копия-ID в сценарии оболочки

ssh-copy-id -i /root/.ssh/id_rsa [email protected]$4 -p $3 | echo $1 

$ 1 см пароль, $ 2 относятся к пользователя, $ 3 относятся к порту и $ 4 относятся к ф, Это нормально с этим, проблема заключается в том, что я должен автоматизировать вставив пароль после:

ssh-copy-id -i /root/.ssh/id_rsa [email protected]$4 -p $3 

добавить этот "| Printf $ 1», но он не работает, показывает„пароль:“на экране и еще ждать пароля .. Я надеюсь, что вы меня понимаете и спасибо

+1

Я не понимаю, зачем вам автоматизировать 'ssh-copy-id'. 'ssh-copy-id' используется для включения входа на удаленный ssh-сервер с помощью ssh-ключа. То есть вы выполняете 'ssh-copy-id' _once_, а затем обычно входите в систему с помощью' ssh'. – redneb

+0

У меня много серверов, и каждую неделю уходит много серверов, поэтому я хочу автоматизировать ведение журнала. – mosab

+0

Попробуйте наоборот: 'echo $ 1 | ssh-copy-id -i /root/.ssh/id_rsa $ 2 @ $ 4 -p $ 3' – Leon

ответ

1

Как @Leon отметили, вы. имел бы трубопровод назад. Но даже если вы сделаете это с правильным порядком, он все равно не будет работать, потому что ssh-copy-id (и все другие программы от openssh) не читают пароли из их stdin. Решение состоит в использовании переменной среды $SSH_ASKPASS. может сделать это следующим образом: во-первых, создайте вспомогательный скрипт, скажем /var/tmp/ssh-pass.sh (на самом деле найти лучшее имя) со следующим содержанием:

#!/bin/sh                  
echo "$PASS" 

Затем вы можете использовать следующую команду, чтобы выполнить то, что вы просили:

PASS="$1" SSH_ASKPASS="/var/tmp/ssh-pass.sh" setsid -w ssh-copy-id -i /root/.ssh/id_rsa "$2"@"$4" -p "$3" 

Объяснение: мы используем setsid -w разъединить в ssh-copy-id процесс от используемого в данный момент терминала. Это заставляет ssh-copy-id запустить исполняемый файл, указанный в $SSH_ASKPASS, чтобы получить пароль. Мы указали наш собственный скрипт в этой переменной, так что ssh-copy-id выполнит именно это. Теперь скрипт должен предоставить пароль для ssh-copy-id, распечатав его на своем уровне. Мы используем переменную $PASS для пароля для скрипта, поэтому сценарий просто печатает эту переменную.

Смежные вопросы