Come scrivere uno script bash, che accede a unaltra macchina per fare cose?

È possibile scrivere uno script bash, che

  1. venga avviato dalla macchina A, acceda a un altro macchina B da ssh (entrambe le macchine A e B sarebbero macchine Linux),
  2. copia alcuni file sulla macchina B
  3. esegue uno script python un dato script python su queste macchine.
  4. trasferisce di nuovo i risultati alla macchina A
  5. si disconnette dalla macchina B.

È tecnicamente fattibile?

Risposta

Ovviamente è fattibile:

scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./ 

e basta …

Ma cè un problema: ti verrà chiesta la password tre volte. Per evitare che tu possa generare chiavi ssh e autorizzare gli utenti con queste chiavi.

Per generare ssh le chiavi eseguono ssh-keygen -t rsa, rispondono alle domande e copiano la chiave pubblica sullhost remoto (macchina B) nel file ~/.ssh/authorized_keys. La chiave privata deve essere salvata in ~/.ssh/id_rsa sul computer locale (A).

Commenti

  • Se le chiavi pubbliche non sono unopzione, potresti fare qualcosa di rozzo per ridurre al minimo le richieste di password come cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Se lo fai si desidera utilizzare la password, è sempre possibile utilizzare il pool di connessioni di OpenSSH ' definendo ControlMaster=yes e ControlPath=/path/to/socketfile, quindi avvia una connessione ssh con -f per eseguire uno ssh in background. Indica a tutte le successive connessioni SSH di utilizzare lo stesso file socket.

Risposta

È possibile fare tutto in una singola ssh connessione / sessione:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst 

Questo:

  1. Copie local_src a remote_dst,
  2. Esegue command,
  3. Copia remote_src in local_dst.

Ma se command scrive su stdout, anche il risultato sarà in local_dst. Se command legge linput da stdin, riceverà e EOF.

Risposta

Anche se puoi farlo allinterno di una singola sessione ssh, “è un po complicato combinare la copia dei file con i comandi in esecuzione.

Il modo più semplice per affrontare questa attività è eseguire sessioni SSH separate per le tre operazioni:

rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/ 

Ciò richiede lautenticazione sulla macchinaB tre volte. Il modo consigliato per evitare lautenticazione più volte è utilizzare la funzione di condivisione della connessione nelle versioni moderne di OpenSSH: avvia una connessione master a B una volta per tutte e lascia che SSH si colleghi automaticamente a quella connessione master. Aggiungi ControlMaster auto e una ControlPath riga al tuo ~/.ssh/config , quindi avvia una connessione principale in background, quindi esegui le tue attività.

ssh -fN machineB # start a master connection in the background # Subsequent connections will be slaves to the existing master connection rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/ 

Invece di utilizzare scp o r rsync per copiare i file, potrebbe essere più semplice montare il filesystem remoto sotto SSHFS . Ciò si occuperà di impostare una connessione principale, tra laltro (supponendo che tu “abbia impostato il tuo ~/.ssh/config come indicato sopra).

mkdir /net/machineB sshfs machineB: /net/machineB cp -Rp inputs /net/machineB/ ssh machibeB "some command -i inputs -o outputs" cp -Rp /net/machineB/outputs . 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *