Hoe schrijf je een bash-script dat inlogt op een andere machine om dingen te doen?

Is het mogelijk om een bash-script te schrijven, dat

  1. zou worden gestart vanaf machine A, inlogt op een andere machine B door ssh (beide machines A en B zouden Linux-machines zijn),
  2. kopieert enkele bestanden naar machine B
  3. voert een python-script uit op een bepaald python-script op deze machines.
  4. stuurt de resultaten terug naar machine A
  5. logt uit van machine B.

Is dit technisch mogelijk?

Antwoord

Natuurlijk is het te doen:

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

en dat is het …

Maar er is één probleem: u wordt driemaal om een wachtwoord gevraagd. Om te voorkomen dat u ssh-sleutels genereert en gebruikers autoriseert met deze sleutels.

Om ssh te genereren sleutels draaien ssh-keygen -t rsa, beantwoord vragen en kopieer publieke sleutel naar externe host (machine B) naar ~/.ssh/authorized_keys bestand. Privésleutel moet worden opgeslagen in ~/.ssh/id_rsa op lokale machine (A).

Opmerkingen

  • Als openbare sleutels geen optie zijn, zou je iets grof kunnen doen om wachtwoordprompts te minimaliseren, zoals cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Als je dat doet als u het wachtwoord wilt gebruiken, kunt u altijd OpenSSH ' s verbindingspooling gebruiken door ControlMaster=yes en ControlPath=/path/to/socketfile, en start dan een ssh-verbinding met -f om een achtergrond-ssh uit te voeren. Vertel alle volgende SSH-verbindingen om hetzelfde socketbestand te gebruiken.

Answer

Ik kan alles doen in een enkele ssh verbinding / sessie:

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

Dit:

  1. Kopieën local_src tot remote_dst,
  2. Voert command,
  3. Kopieert remote_src naar local_dst.

Maar als command schrijft op stdout, het resultaat staat ook in local_dst. Als command invoer leest van stdin, zal het ontvangen en EOF.

Answer

Hoewel je dit binnen een enkele ssh-sessie kunt doen, is het een beetje lastig om het kopiëren van bestanden te combineren met lopende opdrachten.

De gemakkelijkste manier om deze taak uit te voeren, is door afzonderlijke SSH-sessies uit te voeren voor de drie bewerkingen:

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

Dit vereist drie keer authenticatie bij machineB. de aanbevolen manier om meerdere keren authenticatie te voorkomen, is door gebruik te maken van de mogelijkheid om verbindingen te delen in moderne versies van OpenSSH: start voor eens en voor altijd een masterverbinding met B en laat SSH automatisch meeliften op die masterverbinding. Voeg ControlMaster auto en een ControlPath regel toe aan uw ~/.ssh/config , start dan een master-verbinding op de achtergrond en voer vervolgens je taken uit.

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/ 

In plaats van scpo te gebruiken r rsync om bestanden te kopiëren, kan het gemakkelijker zijn om het externe bestandssysteem onder SSHFS te mounten. Dit zorgt trouwens voor het opzetten van een master-verbinding (ervan uitgaande dat je “je ~/.ssh/config hebt ingesteld zoals hierboven aangegeven).

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 . 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *