Hur skriver jag ett bash-skript som loggar in på en annan maskin för att göra saker?

Är det möjligt att skriva ett bash-skript, att

  1. skulle startas från maskin A, loggar in på en annan maskin B av ssh (båda maskinerna A och B skulle vara Linux-maskiner),
  2. kopierar några filer till maskin B
  3. kör ett pythonscript ett givet pythonscript på dessa maskiner.
  4. överför resultaten till maskin A
  5. loggar av från maskin B.

Är detta tekniskt genomförbart?

Svar

Naturligtvis är det möjligt:

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

och det är det …

Men det finns ett problem: du kommer att bli ombedd att ange lösenord tre gånger. För att undvika att du kan skapa ssh-nycklar och auktorisera användare med dessa nycklar. nycklar kör ssh-keygen -t rsa, svara på frågor och kopiera offentlig nyckel till fjärrvärd (maskin B) till ~/.ssh/authorized_keys -fil. Den privata nyckeln bör sparas i ~/.ssh/id_rsa på lokal maskin (A).

Kommentarer

  • Om offentliga nycklar inte är ett alternativ kan du göra något grovt för att minimera lösenordsmeddelanden som cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Om du gör det vill du använda lösenordet, kan du alltid använda OpenSSH ' s anslutningspool genom att definiera ControlMaster=yes och ControlPath=/path/to/socketfile och starta sedan en ssh-anslutning med -f för att köra en bakgrundsssh. Be alla efterföljande SSH-anslutningar att använda samma uttagsfil.

Svar

Jag kan göra allt i en enda ssh anslutning / session:

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

Detta:

  1. Kopior local_src till remote_dst,
  2. Utför command,
  3. Kopierar remote_src till local_dst.

Men om command skriver på stdout, resultatet blir också i local_dst. Om command läser inmatning från stdin, kommer den att ta emot och EOF.

Svar

Medan du kan göra detta i en enda ssh-session är det lite knepigt att kombinera kopieringsfiler med körande kommandon.

Det enklaste sättet att hantera denna uppgift är att köra separata SSH-sessioner för de tre operationerna:

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

Detta kräver autentisering till maskinB tre gånger. rekommenderat sätt att undvika autentisering flera gånger är att använda anslutningsdelningsfaciliteten i moderna versioner av OpenSSH: starta en huvudanslutning till B en gång för alla och låt SSH automatiskt köra tillbaka till den här huvudanslutningen. Lägg till ControlMaster auto och en ControlPath rad till din ~/.ssh/config , starta sedan en huvudanslutning i bakgrunden och utför sedan dina uppgifter.

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/ 

I stället för att använda scp o r rsync för att kopiera filer kan det vara lättare att montera fjärrfilsystemet under SSHFS . Detta tar hand om att skapa en huvudanslutning förresten (förutsatt att du ”har ställt in din ~/.ssh/config som anges ovan).

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 . 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *