Come scrivere uno script bash, che accede a un'altra macchina per fare cose?


11

È possibile scrivere uno script bash, quello

  1. verrebbe avviato dalla macchina A, accederà a un'altra macchina B tramite ssh (entrambe le macchine A e B sarebbero macchine Linux),
  2. copia alcuni file sulla macchina B
  3. esegue uno script Python un determinato script Python su queste macchine.
  4. trasferisce i risultati sulla macchina A
  5. si disconnette dalla macchina B.

È tecnicamente fattibile?

Risposte:


15

Certo è fattibile:

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

e questo è tutto ...

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 chiavi ssh in esecuzione ssh-keygen -t rsa, rispondere alle domande e copiare la chiave pubblica sull'host remoto (macchina B) su ~/.ssh/authorized_keysfile. La chiave privata deve essere salvata ~/.ssh/id_rsasul computer locale (A).


Se le chiavi pubbliche non sono un'opzione, potresti fare qualcosa di rozzo per ridurre al minimo le richieste di password comecat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

Se si desidera utilizzare la password, è sempre possibile utilizzare il pool di connessioni di OpenSSH definendo ControlMaster=yese ControlPath=/path/to/socketfile, quindi avviare una connessione SSH con -fl'esecuzione di un SSH in background. Indica a tutte le successive connessioni SSH di utilizzare lo stesso file socket.
jsbillings,

4

Posso fare tutto in una singola sshconnessione / sessione:

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

Questo:

  1. Copia local_srcin remote_dst,
  2. Esegue command,
  3. Copia remote_srcin local_dst.

Ma se continua a commandscrivere stdout, anche il risultato sarà local_dst. Se commandlegge input da stdin, riceverà e EOF.


3

Mentre puoi farlo all'interno 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 l'autenticazione su machineB tre volte. Il modo consigliato per evitare l'autenticazione più volte è di utilizzare la funzione di condivisione della connessione nelle versioni moderne di OpenSSH: avviare una connessione principale a B una volta per tutte e lasciare che SSH esegua automaticamente il piggyback su quella connessione principale. Aggiungi ControlMaster autoe una ControlPathlinea alla tua~/.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/

Anziché utilizzare scp o rsync per copiare i file, potrebbe essere più semplice montare il filesystem remoto in SSHFS . Questo si occuperà di impostare una connessione principale, a prescindere (supponendo che tu abbia impostato il tuo ~/.ssh/configcome 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 .
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.