2017-01-28 1 views
1

Я нашел этот код в другом месте на StackOverflow:ключей SSH в известных хостах, но серийник -F не ​​работает

if [ -z "`ssh-keygen -F ${wPCS_IP}`" ]; then 
    ssh-keyscan -p ${wPCS_PT} -H ${wPCS_IP} >> ~/.ssh/known_hosts 
fi 

У меня есть два вопроса, где я использую код:

  1. Эти код генерирует ошибку ($? = 1), даже если она преуспевает.

  2. Если я запустил ssh-keygen -F $ {wPCS_IP} еще раз после того, как known_hosts добавлен, он не найдет ключи в known_hosts, хотя они были просто добавлены. Это большая проблема.

Локальный компьютер Ubuntu Server 16.04 LTS, удаленная машина Ubuntu Server 14.04 LTS.

Основное различие между моим кодом и образцом кода, который я нашел, это мое использование опции -p.

Кроме того, я заметил, что файл known_hosts не перечисляет машины по имени или IP-адресу. Это отличается от моего ноутбука Gentoo.

+0

Попробуйте сказать 'ssh-keygen', где находится файл' known_hosts'. Лучший подход - «если! ssh-keygen -F $ {wPCS_IP} -f ~/.ssh/known_hosts>/dev/null 2> & 1; затем ssh-keyscan -p $ {wPCS_PT} $ {wPCS-IP} >> ~/.ssh/known_hosts; fi'. – alvits

+0

Спасибо за ответ. Я использовал вашу команду точно так же, как и она, и она дала те же результаты. Он добавляет строки, необходимые для known_hosts, но при повторном запуске он не обнаруживает хост в файле known_hosts и генерирует их снова. – Raydude

+0

На сервере Ubuntu 16.04 файл known_hosts перечисляет номер порта удаленной машины. Интересно, должен ли порт каким-то образом быть указан для работы ssh-keygen -F? – Raydude

ответ

1

Так получается, что, когда есть альтернативный порт для SSH, он хранится в файле known_hosts как часть IP-адреса в этом формате:

[${WPCS_IP}]:WPCS_PT 

Это означает, что для, если заявление на работу , он должен выглядеть следующим образом:

if ! ssh-keygen -F "[${wPCS_IP}]:${WPCS_PT}" -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${wPCS_PT} ${wPCS-IP} >> ~/.ssh/known_hosts; fi 

Благодаря alvits для получения меня движется в правильном направлении ...

Update: оказывается, в Ubuntu 16.04 encryp ts IP-адрес удаленного хоста (но не порт). Я все еще пытаюсь понять, как приспособиться к этой разнице.

Другое обновление: Оказывается, опция -H - это то, что терпит неудачу. После того, как вы нажали клавишу, он больше не найден. Это работает на Ubuntu 14.04:

if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1 
if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 

Вы можете видеть, что первый, если оператор генерирует keyscan данных, а второй не потому, что keyscan данные верны, но если добавить -НЫ, кейген не обнаруживает хэшированные ключевые элементы ...

Однако, чтобы получить аналогичную команду работать на Ubuntu 16.04, то если должны быть изменено:

if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi 

в этом случае файл known_hosts должен включать в себя порт .. .

-H прямо здесь. Если ключ не будет найден, если он был сгенерирован с -H.

Это расстраивает то, что поведение варьируется от версии к версии и что самая безопасная хешированная версия не работает.

Еще одно редактирование: может быть порт указан в known_hosts, когда удаленный сервер использует нестандартный порт в sshd_config. Это может быть ожидаемым поведением.

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