È possibile scrivere uno script bash, che
- venga avviato dalla macchina A, acceda a un altro macchina B da ssh (entrambe le macchine A e B sarebbero macchine Linux),
- copia alcuni file sulla macchina B
- esegue uno script python un dato script python su queste macchine.
- trasferisce di nuovo i risultati alla macchina A
- 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
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:
- Copie
local_src
aremote_dst
, - Esegue
command
, - Copia
remote_src
inlocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
eControlPath=/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.