Posso reindirizzare lo stdout su un server allo stdin su un altro server?


74

stdoutsu un server CentOS è necessario eseguire il piping stdinsu un altro server CentOS. È possibile?

Aggiornare

ScottPack, MikeyB e jofel hanno tutti risposte valide. Ho assegnato la risposta a Scott perché, anche se la mia domanda non specificava la sicurezza come requisito, è sempre bello essere al sicuro. Tuttavia, anche i suggerimenti degli altri due colleghi funzioneranno.


1
Vale la pena notare che il (unico) grande vantaggio dell'approccio non-ssh è la velocità di throughput; se sei su una rete veloce e la sicurezza non è necessaria, potrebbe valere la pena l'inconveniente di digitare due comandi in due finestre.
Casuale 832

Risposte:


94

Questo è un si sfacciato.

Quando si usa sshper eseguire un comando su un server remoto, si esegue un certo tipo di reindirizzamento interno di input / output. In effetti, trovo che questa sia una delle caratteristiche leggermente più belle di OpenSSH. In particolare, se si utilizza sshper eseguire un comando arbitrario su un sistema remoto, allora ssh mapperà STDINe STDOUTquello del comando in esecuzione.

Ai fini di un esempio, supponiamo che tu voglia creare un tarball di backup, ma non vuoi, o non puoi, memorizzarlo localmente. Diamo un'occhiata a questa sintassi:

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

Stiamo creando un tarball e lo stiamo scrivendo su STDOUTcose normali. Dato che stiamo usando ssh per eseguire un comando remoto, STDIN viene mappato su STDINdi cat. Che quindi reindirizziamo a un file.


11
Non è una sorta di "reindirizzamento interno di input / output di fantasia", ma solo roba normale e noiosa. ssh legge da STDIN, proprio come qualsiasi altro strumento, e lo passa al processo remoto. :)
Daniel Pittman,

7
@DanielPittman: Ma è molto più divertente definirlo "spazzatura interna".
Scott Pack

7
Allo stesso modo, netcatsu entrambe le estremità si crea un canale di comunicazione semplice, facile e intuitivo. tar cf - /path/to/dir | nc 1.2.3.4 5000su un server, nc -l -p 5000 > backupfile.tarsull'altro.
MikeyB,

1
@MikeyB: buon punto. Netcat è un protocollo in chiaro, quindi fai attenzione con i dati sensibili. Tendo ad usare netcat per cose più specifiche come le acquisizioni di unità di rete (ala dd) su una rete locale e la scansione delle porte.
Scott Pack

2
@MikeyB: gente che succede con i vostri sedili volanti e pantaloni!
Scott Pack

28

Un modo conveniente per eseguire il piping dei dati tra host quando non è necessario preoccuparsi della sicurezza tramite il filo è utilizzare netcatad entrambe le estremità della connessione.

Ciò consente anche di configurarli in modo asincrono:

Sul "ricevitore" (davvero, avrai una comunicazione a due vie, ma è più facile pensarla così), esegui:

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

E sul "mittente", esegui:

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

Molto bene a sapersi. Questo è utile se la connessione fisica è attendibile come forse una rete di backup o se la connessione è già tunnel.
Wesley,

O se i dati sono comunque pubblici.
Samuel Edwin Ward,

1
+1 netcat è uno strumento prezioso, soprattutto quando non si dispone di un server SSH in esecuzione.
kwarrick,

21

È uno strumento molto potente per la creazione di connessioni uni- e bidirezionali socat. Per una breve occhiata alle possibilità, guarda gli esempi nella sua manpage .

Sostituisce netcatcompletamente e strumenti simili e supporta le connessioni crittografate SSL. Per i principianti, potrebbe non essere abbastanza semplice, ma è bene sapere che esiste.


1
@WesleyDavid: Al tuo "aggiornamento": solo per completezza, ho aggiunto alla mia risposta che socat ha il supporto SSL, quindi anche la crittografia è possibile con socat. Tuttavia, ssh è nella maggior parte dei casi la soluzione migliore e più semplice, quindi avrei scelto anche la risposta di ScottPack.
jofel

5

TL; DR

Le cose diventano leggermente più complicate quando si dispone di un server bastione che deve essere utilizzato.

  1. Puoi passare sshcome comando per sshamare così:

    • 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. Attenzione agli pseudo-terminali


Si noti che il punto di importanza chiave qui è che ssh, come la maggior parte degli strumenti, tratta stdoute stdincorregge solo per impostazione predefinita.

Tuttavia, quando inizi a vedere un'opzione simile Disable pseudo-terminal allocation.e Force pseudo-terminal allocation.potresti dover fare una piccola prova ed errore. Ma, come regola generale, non si desidera modificare il ttycomportamento a meno che non si stia tentando di correggere la spazzatura confusa / binaria in un emulatore di terminale (in cosa digita un essere umano).

Ad esempio, tendo a usarlo in -Atmodo che l'ssh-agent della mia stazione di lavoro venga inoltrato e in modo che l'esecuzione di tmux in remoto non verifichi binario (in questo modo ssh -At bastion.internal tmux -L bruno attach). E, anche per la docker (così sudo docker exec -it jenkins bash).

Tuttavia, quei due -tflag causano alcuni problemi per rintracciare il danneggiamento dei dati quando provo a fare qualcosa del genere:

# 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

Prova a mettere la tua chiave pubblica ssh in un altro host con un solo comando

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

2

Trovo che questo sia il più semplice, dopo aver impostato l'handshaking della password tra i server per l'utente, stai eseguendo il comando come:

Non compresso

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

Compressione al volo

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

L'uso della compressione sul file tar è una pessima idea se il tuo sshè già configurato per la compressione.
Anthon,

@Anthon Perché così male, e come si controlla se la compressione ssh è già abilitata?
Tom Hale,

1
@TomHale A seconda della velocità del tuo sistema, ciò potrebbe rallentare il funzionamento generale, poiché la seconda compressione richiede tempo, ma è improbabile che si verifichino rasature di byte aggiuntivi. Compressionpotrebbe essere impostato in uno qualsiasi dei file di configurazione, un rapido controllo è quello di vedere se ssh -v localhost exit 2>&1 | fgrep -i compressfornisce qualche output (AFAIK non ha alcuna opzione per scaricare la configurazione come ssh l'ha letto).
Anthon,

tarha una -C pathbandiera che funziona per entrambe le ce xcomandi. Non è necessario inserire un cdcomando separato . (Ma è bene notare che è possibile eseguire più di un singolo comando.)
Bruno Bronosky,

@Bruno, -Cè un'estensione GNU (anche se ora supportata anche da bsdtar e schily tar)
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.