Вопрос: Неинтерактивный git-клон (ssh отсканированный отпечаток пальца) [дубликат]


На этот вопрос уже есть ответ:

Я хочу клонировать репо неинтерактивным способом. При клонировании git просит подтвердить отпечаток хозяина:

The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no

Как я могу заставить «да» каждый раз, когда появятся эти вопросы? Я попытался использовать yes yes | git clone ..., но это не сработает.

РЕДАКТИРОВАТЬ: Вот решение: Могу ли я автоматически добавить новый хост к known_hosts? (добавляет to known_hosts с ssh-keyscan).


104
2017-11-09 09:04


Источник


Интересно видеть, что даже через два года этот вопрос не имеет правильного ответа. Есть несколько других случаев, когда git подскажет, например, если вы пытаетесь клонировать через http, а сервер запрашивает basic_auth. Как это сделать в режиме без взаимодействия? - sorin
Добавление -q вариант (тихий) сделал это для меня. Теперь я застрял, автоматизируя кодовую фразу.


Ответы:


Я не думаю, что это лучшее решение, но это решение для меня.

ОТВЕТ:

Добавление доменных имен в known_hosts с помощью ssh-keyscan команда решила проблему:

ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts


83
2017-11-02 04:13



Пожалуйста, не делайте этого. Это абсолютно НЕ БЕЗОПАСНО: отпечатки пальцев не здесь, чтобы раздражать вас, но чтобы убедиться, что вы не сталкиваетесь с атакой «человек в середине». См. Мой ответ ниже. - autra
как я сказал: «Я не думаю, что это лучшее решение, но для меня это решение». потому что я был в спешке, конечно, есть «правильный полицейский путь» этого ((: - kroe
Дело не в политически правильном :-) Это вопрос о том, безопасно это или нет. Ваше решение безопасно тогда и только тогда, когда вы вручную проверяете отпечаток пальца после ssh-keyscan и перед добавлением его в .ssh/known_hosts быть таким же, как один github опубликовал на своем веб-сайте. Вы можете сделать это несколькими способами, и мой - один из них. Вы также можете выполнить равную проверку в своем скрипте, но в конце все это приходит к такому: вам нужен ваш скрипт, чтобы узнать, какой отпечаток он ожидает, и вам нужно, чтобы он потерпел неудачу, если он не получил правильный. - autra
добавить ключ ТОЛЬКО, если он не существует ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
Выполнение этого один раз в рамках управления конфигурацией или прогона обеспечения должно быть прекрасным. Если отпечаток пальца когда-либо изменится в будущем, тогда ssh будет работать по назначению и предупредит вас о том, что сертификат изменился, возвращая код выхода без 0. Вероятно, это остановит любой скрипт, в котором вы используете ssh или git. - emhohensee


Ни один из ответов не защищен. У вас есть 2 варианта:

Используйте протокол https вместо git

Он не будет запрашивать у вас отпечатки пальцев, потому что ssh не задействован, вместо этого используется https (duh). Если вы используете минималистское изображение или Docker, вам может потребоваться установить пакет ca-сертификатов.

Если вам действительно нужен протокол git + ssh

Вам действительно нужно добавить ключ во время выполнения? Это совершенно небезопасно.

Прежде чем запускать скрипт, получите ключ от github (на вашем локальном компьютере):

ssh-keyscan github.com >> githubKey

Создайте отпечаток пальца:

ssh-keygen -lf githubKey

И проверьте это вручную против перечисленных на этой странице (хорошо, вы доверяете сертификатам https и OpenSSL, чтобы принести вам оригинальный веб-сайт github, но он все же намного лучше, чем слепо принимать открытый ключ).

Затем вы укажете его в своем скрипте, добавив в него:

echo '<copy paste the content of 'cat githubKey' on your machine>'  >> ~/.ssh/known_hosts

перед git-клоном.

Открытый ключ GitHub будет изменяться только в том случае, если он считает, что он был скомпрометирован (или недостаточно безопасен). Если это когда-нибудь, вы хотеть ваш скрипт в любом случае терпит неудачу.


74
2018-06-25 15:39



Эта является единственным правильным и безопасным ответом на вопрос. Почему он последний? Я стыжусь человечества ;-( - Jan Warchoł
К сожалению, вы не можете делать неинтерактивные HTTPS с GitHub, если вы используете два фактора auth. - Brett Widmeier
Я не понимаю, почему нет. Мы говорим о публичном репо здесь, нет необходимости в аутентификации. Клонирование частного репо из сценария - это совсем другое: вам нужно авторизовать свой скрипт для этого. - autra
Проверка отпечатка пальца «вручную» менее болезненна, чем кажется, с помощью «панели поиска» у современных исследователей (например, в Хром). - Franklin Yu


Я считаю, что лучшим вариантом здесь является резервное копирование и ~/.ssh/known_hosts файл, вручную выполнить SSH-соединение, проверить IP-адрес и отпечаток пальца, mv ~/.ssh/known_hosts ~/bitbucket_hosts, затем используйте содержимое ~/bitbucket_hostsв вашем скрипте, чтобы автоматически добавлять известные отпечатки к файлу known_hosts (не забудьте восстановить оригинал ~/.ssh/known_hosts).

Этот шаг нужно выполнить только один раз (на любой машине, я полагаю), и как только у вас есть отпечатки пальцев, вы можете включить его в свой сценарий автоматизации.


7
2018-04-07 18:53





Хотя я, конечно, понимаю, что вы хотите автоматизировать такой процесс, сделать это было бы неразумным. Причина, по которой SSH и связанные с ней сетевые подкомпоненты перекрываются при использовании защищенного протокола, - это ПРЕДУПРЕЖДЕНИЕ человека, что открытый ключ системы неизвестен. Это преднамеренно - пользователю необходимо явно информировать систему о ожидаемом хосте. Вы не хотели бы автоматически принимать каждый открытый ключ, предоставленный вам, или часть безопасности в SSH или TLS / SSL может быть скомпрометирована. Один пример - с помощью атаки «человек-в-середине», например, когда прокси-программное обеспечение представляет собственный ключ на месте хоста, которого вы ожидаете.

Действовать с осторожностью.

Если у вас нет страха по поводу источника кода через провод, вы должны явно и исключительно использовать протокол git: // при клонировании - это без аутентификации и в ясном тексте.


6
2018-01-22 22:34



Я могу окончательно увидеть примеры использования, когда нам необходимо обеспечить неинтерактивное использование git clone... и это не значит, что мы должны принять любую проверку (в частности, отпечаток пальца). В моем случае я был бы совершенно рад автоматически с этим справиться. - vaab


Как сказал Джефф-Холл, делать это опасно, так как он позволяет атаковать невинных людей в середине. Однако вы можете использовать StrictHostKeyChecking no в ssh, чтобы отключить проверку ключей хоста. Однако, если бы я был вами, я был бы очень осторожен с этим вариантом.


5
2018-02-03 07:45



Это также позволяет человеку-в-середине правильно? - autra


Добавление ключа в .ssh/known_hosts кажется, правильная вещь.

Хотя, когда вы автоматизируете задачу, вы хотите убедиться, что ключ уже не содержится и добавлен на каждом clone/pull задания.

Этот фрагмент добавит только отпечаток пальца, если он еще не найден:

if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi

3
2018-02-16 10:42



Это было прекрасно. Легко можно добавить в сценарий развертывания и безопаснее отключить проверку хоста. Вот один лайнер для github: if [ ! -n "$(grep "^github.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null; fi; ssh-agent bash -c "ssh-add /path/to/your/deploy/id_rsa; git clone -b master git@github.com:githubAccount/githubRepo.git /your/target/dir - tweak2
Это не работает, когда HashKnownHosts включен в / И т.д. / SSH / ssh_config (или ~ / .ssh / конфигурации). Вместо [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] было бы лучше использовать [ ! "$(ssh-keygen -F bitbucket.org)" ], который находит как хешированные, так и не хешированные строки в known_hosts, - Claus Conrad