stdout
na jednym serwerze CentOS musi być podłączony do stdin
innego serwera CentOS. czy to możliwe?
Aktualizacja
ScottPack, MikeyB i jofel mają poprawne odpowiedzi. Odpowiedziałem Scottowi, ponieważ chociaż moje pytanie nie określało bezpieczeństwa jako wymogu, zawsze miło jest być bezpiecznym. Jednak sugestie pozostałych dwóch stypendystów również się sprawdzą.
Odpowiedzi:
To bezwstydne tak.
Kiedy używa
ssh
się polecenia do wykonania polecenia na zdalnym serwerze, dokonuje on pewnego rodzaju fantazyjnego wewnętrznego przekierowania wejścia / wyjścia. W rzeczywistości uważam, że jest to jedna z subtelniejszych funkcji OpenSSH. W szczególności, jeśli użyjeszssh
do wykonania dowolnego polecenia w systemie zdalnym, ssh zamapujeSTDIN
iSTDOUT
na polecenie wykonywanego polecenia.Na przykład załóżmy, że chcesz utworzyć archiwum zapasowe, ale nie chcesz lub nie możesz przechowywać go lokalnie. Spójrzmy na tę składnię:
Tworzymy tarball i piszemy to
STDOUT
, normalne rzeczy. Ponieważ używamy ssh wykonanie polecenia zdalnego, STDIN zostanie odwzorowany doSTDIN
odcat
. Które następnie przekierowujemy do pliku.źródło
netcat
na obu końcach stanowi świetny prosty i łatwy kanał komunikacji.tar cf - /path/to/dir | nc 1.2.3.4 5000
na jednym serwerze,nc -l -p 5000 > backupfile.tar
na drugim.Wygodnym sposobem przesyłania danych między hostami, gdy nie trzeba się martwić o bezpieczeństwo w sieci, jest użycie
netcat
na obu końcach połączenia.Pozwala to również skonfigurować je asynchronicznie:
Na „odbiorniku” (tak naprawdę będziesz miał dwukierunkową komunikację, ale łatwiej o tym pomyśleć):
A na „nadawcy” uruchom:
źródło
Bardzo potężnym narzędziem do tworzenia połączeń jedno- i dwukierunkowych jest
socat
. Aby zapoznać się z możliwościami, zobacz przykłady na stronie podręcznika .Zastępuje
netcat
całkowicie i podobne narzędzia i obsługuje połączenia szyfrowane ssl. Dla początkujących może to nie być dość proste, ale dobrze jest wiedzieć, że istnieje.źródło
TL; DR
Sprawy stają się nieco bardziej skomplikowane, gdy masz serwer bastionu, którego musisz użyć.
Możesz przekazać
ssh
jako polecenie, abyssh
:cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
Uważaj na pseudo-terminale
Zauważ, że kluczowe znaczenie ma tutaj
ssh
, podobnie jak większość narzędzi, domyślna obróbkastdout
istdin
poprawka.Jednak gdy zaczniesz widzieć opcję podobną
Disable pseudo-terminal allocation.
iForce pseudo-terminal allocation.
być może będziesz musiał zrobić trochę prób i błędów. Ale, jako ogólną zasadę , że nie chcesz, aby zmienićtty
zachowanie, jeśli nie starają się naprawić nieczytelny / śmieci binarnego w emulatorze terminala (co w ludzkiej typy).Na przykład zwykle używam,
-At
aby agent ssh mojej stacji roboczej został przekazany dalej, a zdalne uruchamianie tmuxa nie powodowało blokowania plików binarnych (tak jak tossh -At bastion.internal tmux -L bruno attach
). I również dla dokerów (taksudo docker exec -it jenkins bash
).Te dwie
-t
flagi powodują jednak trudne śledzenie uszkodzenia danych, gdy próbuję zrobić coś takiego:źródło
Spróbuj umieścić klucz publiczny ssh na innym hoście za pomocą jednego polecenia
źródło
Uważam, że jest to najłatwiejsze, po skonfigurowaniu braku uzgadniania hasła między serwerami dla użytkownika, który uruchamia polecenie:
Bez kompresji
Kompresja w locie
źródło
ssh
już skonfigurowaną kompresję.Compression
można ustawić w dowolnym pliku konfiguracyjnym, szybkie sprawdzenie tego, czyssh -v localhost exit 2>&1 | fgrep -i compress
daje jakieś dane wyjściowe (AFAIK nie ma opcji zrzucenia konfiguracji, ponieważ ssh ją wczytał).tar
ma-C path
flagę, która działa zarówno dla poleceń jakc
ix
. Nie musisz tam umieszczać osobnegocd
polecenia. (Ale warto zauważyć, że można uruchomić więcej niż jedno polecenie).-C
to rozszerzenie GNU (choć teraz obsługiwane również przez bsdtar i schily tar)