Jak dodać znany host SSH w skrypcie bash?

13

Tworzę skrypt bash, aby udostępnić nowy serwer, na którym mogę wdrożyć aplikację internetową. Jedną rzeczą, którą zawsze muszę robić, jest tak samo GitHub, jak znany host ssh [email protected]. Jak mogę zautomatyzować ten proces w skrypcie bash i zrobić to w idempotentny sposób?

Andrzej
źródło

Odpowiedzi:

17

Najprostszym sposobem byłoby zrobienie czegoś takiego.

ssh-keyscan remote_server >>~/.ssh/known_hosts

Jeśli to pole jest zupełnie nowe, może być konieczne utworzenie ~/.sshkatalogu przed uruchomieniem ssh-keyscan .

Pamiętaj, że ssh-keyscan może przyjmować dowolną liczbę nazw hostów. Otrzyma wszystkie klucze, jakie może.

Zoredache
źródło
1
PS - Do zaopatrzenia powinieneś używać czegoś takiego jak marionetka zamiast skryptu bash. W przypadku marionetki można to łatwo rozwiązać za pomocą zasobu sshkey . Zobacz także to pytanie dotyczące metody zarządzania
znanymi serwerami
2
To z pewnością brzmiało dla mnie dobrze, ale po spędzeniu kilku godzin na marionetce i zawodnikach wróciłem do pisania scenariuszy i zdrowego rozsądku. Jeśli te narzędzia są intuicyjne, najwyraźniej nie mam intuicji. YMMV.
Ron Burk,
Użyj bash. Ciągle mam problemy z różnymi wersjami rzeczy, takich jak marionetka lub ansible. Zawsze wracamy do bash ... 3 firmy działają teraz w ten sposób, a bash jest dla nas zawsze niezawodny.
Ligemer,
4

Czy próbujesz zautomatyzować przyjmowanie nowego klucza? Jeśli tak, możesz użyć opcji -oStrictHostKeyChecking = no.
Jest to bardzo zły pomysł, ponieważ jesteś teraz całkowicie otwarty na ataki typu man-in-the-middle.

Lepszym rozwiązaniem byłoby po prostu zarządzanie plikiem znane_hosty i ponowne użycie tego pliku podczas udostępniania nowych serwerów. Naklej go na github i napisz prosty skrypt, aby pobrać ten plik przed sshingiem do github.

Ścisłe sprawdzanie klucza hosta jest dobrą rzeczą.

yoonix
źródło
Czy potrafisz rozwinąć „zarządzać plikiem znanych_hostów”? Myślę, że to właśnie chcę zrobić, ale kiedy przeglądałem plik, jego zawartość wyglądała jak jakiś skrót / klucz i nie wyglądała na coś, co miało być zarządzane ręcznie.
Andrew,
2
Zaopatrz nowy serwer, ręcznie ssh w github, tak jak ty. Po wyświetleniu monitu zaakceptuj klucz hosta. Wyloguj. Skopiuj ~ / .ssh / znane_hosty z tego nowo zainicjowanego serwera gdzieś indziej (github, serwer WWW, nie ma znaczenia tak długo, jak możesz go zdobyć). Następnym razem, gdy udostępnisz serwer, skopiuj ten plik z powrotem przed sshing do github. Nie musisz edytować pliku.
yoonix,
To jest lepsze niż moja odpowiedź (bezpieczniejsza). Kolejnym ulepszeniem odpowiedzi yoonix jest parsowanie „ssh-keyscan github.com” i przechowywanie zwróconego klucza w ~ / .ssh / known_hosts w ten sposób, że nie jest on statyczny w pliku, który należy zaktualizować.
Sirex,
To też by działało, ale nie uważałbym tego za lepsze. Potencjalnie przygotowujesz się do ataku man-in-the-middle, jeśli za każdym razem chwytasz nowy klucz hosta.
yoonix,
1
Aby wyjaśnić mój ostatni komentarz (za późno na edycję): Pobieranie nowego klucza hosta za każdym razem, gdy hostujesz hosta, funkcjonalnie nie różni się od ustawiania StrictHostKeyChecking = no. Z każdym z nich ślepo ufasz, że klucz zostanie wysłany za każdym razem, gdy dostarczysz. Jeśli uważasz, że atak MITM jest mało prawdopodobny, przeczytaj te dwa artykuły. Github byłby OGROMNYM celem.
yoonix,
1

Nie jestem pewien, czy rozumiem pytanie, ale myślę, że chcesz zignorować monit znany_host lub całkowicie go uniknąć, w takim przypadku:

ssh -o StrictHostKeyChecking = nie

lub inne sugestie na stronie : http://www.joedog.org/2012/07/ssh-disable-known_hosts-prompt/

Sirex
źródło
Chcę nieinteraktywny sposób akceptowania klucza hosta GitHub (ponieważ stanie się to w skrypcie bash).
Andrew,
to zadziała - jednak nie zaakceptuje klucza, całkowicie go zignoruje. Odpowiedź Yoonix jest lepsza
Sirex