Come posso creare una connessione SSH permanente ai comandi di "streaming" per un periodo di tempo?


9

Supponiamo che io abbia un'applicazione in esecuzione su un PC che sta inviando comandi tramite SSH a un altro PC sulla rete (entrambe le macchine che eseguono Linux).

Ad esempio, ogni volta che succede qualcosa sul n. 1, voglio eseguire un'attività sul n. 2. In questa configurazione, devo creare una connessione SSH su ogni singolo comando.

Esiste un modo semplice per farlo con gli strumenti unix di base senza programmare un'applicazione client / server personalizzata? Fondamentalmente tutto ciò che voglio è stabilire una connessione su SSH e quindi inviare un comando dopo l'altro.


Risposte:


12

Non sono sicuro che possa essere utilizzato in produzione ma puoi fare qualcosa del genere:

crea file su # 1

1> touch /tmp/commands

Quindi eseguire il comando:

1> tail -f /tmp/commands | ssh username@x.x.x.x

Questo aprirà file / tmp / comandi e inizierà a inviare il suo contenuto al server xxxx (# 2) e lo eseguirà riga per riga

ora, ogni volta che succede qualcosa al primo posto:

1> echo "ls -l" >> /tmp/commands

o

1> echo "reboot" >> /tmp/commands

tutto ciò che aggiungi al file / tmp / comandi verrà inviato al numero 2 ed eseguito. Assicurati solo di non eseguire nulla di interattivo o di gestirlo in qualche modo.


È esattamente quello che stavo cercando, una soluzione molto creativa :)
Jakub Arnold,

5
Aggiungo che dovresti usare tail -F, che rileverà che il file è stato sostituito, quindi quando diventa gigante puoi cancellarlo e ricominciare con un nuovo file.
DerfK,

3
@DerfK, in alternativa, mkfifo /tmp/commandsdovrebbe essere una soluzione migliore
solotim


18

Persistenza automatica tramite OpenSSH

È inoltre possibile utilizzare la ControlMasterfunzione di OpenSSH, che apre un socket di dominio unix per la prima connessione e riutilizza questa connessione in tutte le chiamate successive.

Per abilitare la funzione, è possibile utilizzare -Mcome ControlMasteropzione della riga di comando o abilitare l' opzione nel proprio ~/.ssh/ssh_config, ad esempio:

ControlMaster auto

Inoltre, dovresti impostare ControlPathusando le seguenti righe nel tuo ~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p

Per mantenere una connessione persistente a un host, ad esempio se si desidera eseguire uno script che deve stabilire molte connessioni ssh all'host, nessuna delle quali persistente per tutta la durata dello script, è possibile avviare in anticipo una connessione silenziosa utilizzando:

ssh -MNf remotehost

Cheerio, nesono


Ho effettuato l'accesso al server fault solo per +1 votare la tua risposta. Il tuo ha funzionato!
Karma,

ssh -Navvia una sessione senza comando remoto, sembra che non ci siano opzioni corrispondenti in ssh_config.
Jokester,

2

In /etc/ssh/ssh_configaggiunta

# Send keep alive signal to remote sshd
ServerAliveInterval 60

2

Se ti imbatti molto in questo genere di cose, prova Parallel . È come dsh (shell distribuita) ma ha alcune caratteristiche pulite come il conteggio dei semafori e viene mantenuto attivamente.

Dalla documentazione:

ESEMPIO: GNU Parallelo come sistema di coda / gestore batch

GNU Parallel può funzionare come un semplice sistema di code lavoro o gestore batch. L'idea è quella di mettere i lavori in un file e far sì che GNU Parallel li legga continuamente. Dato che GNU Parallel si fermerà alla fine del file, usiamo tail per continuare a leggere:

echo >jobqueue; tail -f jobqueue | parallel

Per inviare i lavori alla coda:

echo my_command my_arg >> jobqueue

Ovviamente puoi usare -S per distribuire i lavori su computer remoti:

echo >jobqueue; tail -f jobqueue | parallel -S ..

Ci sono molti grandi esempi che graffiano la superficie. Eccone una bella.

ESEMPIO: distribuire lavoro a computer locali e remoti

Converti * .mp3 in * .ogg eseguendo un processo per core della CPU sul computer locale e sul server2:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3

0

si è possibile con una pipe:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

questo eseguirà il comando echo "hi" su host2

devi solo scrivere un programma, che da solo i comandi (non dimenticare il;) e poi reindirizza l'output a ssh


0

Potresti voler usare un programma come dsh (Distributed SHell) fatto apposta per farlo :), dopo averlo configurato con nomi host e aver impostato l'autent di publickeya, puoi usarlo per eseguire comandi su più macchine in serie ("run sulla macchina a quindi eseguire sulla macchina b ") o in pararell (" eseguire su tutte le macchine allo stesso tempo "). O semplicemente fare una sceneggiatura

#!/bin/sh
ssh machine -- $@
exec $@

0

DICHIARAZIONE DI NON RESPONSABILITÀ: non posso provarlo adesso, dato che sono su una macchina Windows con bash ma senza SSH.

In uno script bash, puoi fare qualcosa del genere:

exec 4> >(ssh --ssh-options-here user@host)

E quindi per inviare comandi, scrivili su FD 4.

echo 'echo hi' >&4

Se lo fai in questo modo, non puoi accedere facilmente ai risultati dei comandi, ma in base alla tua domanda non sembra che sia necessario.

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.