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 git@github.com. Jak mogę zautomatyzować ten proces w skrypcie bash i zrobić to w idempotentny sposób?

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.


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ą.


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/


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.