Czy mogę potokować stdout na jednym serwerze, aby stdin na innym serwerze?


74

stdoutna jednym serwerze CentOS musi być podłączony do stdininnego 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ą.


1
Warto zauważyć, że (jedyną) główną zaletą podejścia innego niż ssh jest szybkość przepustowości; jeśli jesteś w szybkiej sieci, a bezpieczeństwo nie jest konieczne, może być warte dodatkowej niedogodności wpisania dwóch poleceń w dwóch oknach.
Random832,

Odpowiedzi:


94

To bezwstydne tak.

Kiedy używa sshsię 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żyjesz sshdo wykonania dowolnego polecenia w systemie zdalnym, ssh zamapuje STDINi STDOUTna 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ę:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Tworzymy tarball i piszemy to STDOUT, normalne rzeczy. Ponieważ używamy ssh wykonanie polecenia zdalnego, STDIN zostanie odwzorowany do STDINod cat. Które następnie przekierowujemy do pliku.


11
To nie jest żadne „fantazyjne wewnętrzne przekierowanie wejścia / wyjścia” - tylko zwykłe, nudne zwykłe rzeczy. ssh czyta ze STDIN, jak każde inne narzędzie, i przekazuje go do zdalnego procesu. :)
Daniel Pittman,

7
@DanielPittman: Ale to jest po prostu tak dużo więcej zabawy to nazwać „fantazyjne wewnętrzny” śmieci.
Scott Pack

7
Podobnie netcatna obu końcach stanowi świetny prosty i łatwy kanał komunikacji. tar cf - /path/to/dir | nc 1.2.3.4 5000na jednym serwerze, nc -l -p 5000 > backupfile.tarna drugim.
MikeyB,

1
@MikeyB: Dobra uwaga. Netcat jest protokołem tekstowym, dlatego należy zachować ostrożność w przypadku poufnych danych. Zazwyczaj używam netcata do bardziej specyficznych rzeczy, takich jak nabywanie dysków sieciowych (ala dd) w sieci lokalnej i skanowanie portów.
Scott Pack

2
@MikeyB: Wy ludzie, którzy latają i siedzą w spodniach!
Scott Pack

28

Wygodnym sposobem przesyłania danych między hostami, gdy nie trzeba się martwić o bezpieczeństwo w sieci, jest użycie netcatna 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ć):

nc -l -p 5000 > /path/to/backupfile.tar

A na „nadawcy” uruchom:

tar cf - /path/to/dir | nc 1.2.3.4 5000

Bardzo dobrze wiedzieć. Jest to dobre, jeśli połączenie fizyczne jest zaufane, jak sieć zapasowa lub połączenie jest już tunelowane.
Wesley,

Lub jeśli dane i tak są publiczne.
Samuel Edwin Ward

1
+1 netcat jest nieocenionym narzędziem, szczególnie gdy nie masz uruchomionego serwera ssh.
kwarrick

21

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 netcatcał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.


1
@WesleyDavid: Do twojej „aktualizacji”: Dla kompletności dodałem do mojej odpowiedzi, że socat ma obsługę SSL, więc szyfrowanie jest również możliwe. Jednak ssh jest w większości przypadków lepszym i łatwiejszym rozwiązaniem, więc wybrałbym również odpowiedź ScottPacka.
jofel

5

TL; DR

Sprawy stają się nieco bardziej skomplikowane, gdy masz serwer bastionu, którego musisz użyć.

  1. Możesz przekazać sshjako polecenie, aby ssh:

    • 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"
  2. Uważaj na pseudo-terminale


Zauważ, że kluczowe znaczenie ma tutaj ssh, podobnie jak większość narzędzi, domyślna obróbka stdouti stdinpoprawka.

Jednak gdy zaczniesz widzieć opcję podobną Disable pseudo-terminal allocation.i Force 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ć ttyzachowanie, jeśli nie starają się naprawić nieczytelny / śmieci binarnego w emulatorze terminala (co w ludzkiej typy).

Na przykład zwykle używam, -Ataby agent ssh mojej stacji roboczej został przekazany dalej, a zdalne uruchamianie tmuxa nie powodowało blokowania plików binarnych (tak jak to ssh -At bastion.internal tmux -L bruno attach). I również dla dokerów (tak sudo docker exec -it jenkins bash).

Te dwie -tflagi powodują jednak trudne śledzenie uszkodzenia danych, gdy próbuję zrobić coś takiego:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

Spróbuj umieścić klucz publiczny ssh na innym hoście za pomocą jednego polecenia

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

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

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Kompresja w locie

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

Używanie kompresji w pliku tar jest bardzo złym pomysłem, jeśli masz sshjuż skonfigurowaną kompresję.
Anthon

@Anthon Dlaczego tak źle i jak sprawdzić, czy kompresja ssh jest już włączona?
Tom Hale,

1
@TomHale W zależności od szybkości systemu może to spowolnić całą operację, ponieważ druga kompresja wymaga czasu, ale jest mało prawdopodobne, aby golić dodatkowe bajty. Compressionmożna ustawić w dowolnym pliku konfiguracyjnym, szybkie sprawdzenie tego, czy ssh -v localhost exit 2>&1 | fgrep -i compressdaje jakieś dane wyjściowe (AFAIK nie ma opcji zrzucenia konfiguracji, ponieważ ssh ją wczytał).
Anthon

tarma -C pathflagę, która działa zarówno dla poleceń jak ci x. Nie musisz tam umieszczać osobnego cdpolecenia. (Ale warto zauważyć, że można uruchomić więcej niż jedno polecenie).
Bruno Bronosky

@Bruno, -Cto rozszerzenie GNU (choć teraz obsługiwane również przez bsdtar i schily tar)
Stéphane Chazelas
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.