Hvordan skriver jeg et bash-skript som logger på en annen maskin for å gjøre ting?

Er det mulig å skrive et bash-skript, at

  1. vil bli startet fra maskin A, logger inn på en annen maskin B av ssh (begge maskinene A og B ville være Linux-maskiner),
  2. kopierer noen filer videre til maskin B
  3. kjører et pythonscript et gitt pythonscript på disse maskinene.
  4. overfører resultatene tilbake til maskin A
  5. logger av fra maskin B.

Er dette teknisk gjennomførbart?

Svar

Selvfølgelig kan det gjøres:

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

og det er det …

Men det er ett problem: du blir bedt om passord tre ganger. For å unngå at du kan generere ssh-nøkler og autorisere brukere med disse nøklene.

For å generere ssh nøkler kjører ssh-keygen -t rsa, svar på spørsmål og kopier offentlig nøkkel til ekstern vert (maskin B) til ~/.ssh/authorized_keys -fil. Privat nøkkel bør lagres i ~/.ssh/id_rsa på lokal maskin (A).

Kommentarer

  • Hvis offentlige nøkler ikke er et alternativ, kan du gjøre noe grovt for å minimere passordmeldinger som cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Hvis du gjør det Hvis du vil bruke passordet, kan du alltid bruke OpenSSH ' s tilkoblingssamling ved å definere ControlMaster=yes og ControlPath=/path/to/socketfile, og start deretter en ssh-forbindelse med -f for å kjøre en bakgrunns-ssh. Be alle påfølgende SSH-tilkoblinger bruke den samme sokkelfilen.

Svar

Jeg er mulig å gjøre alt i en enkelt ssh tilkobling / økt:

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

Dette:

  1. Kopier local_src til remote_dst,
  2. Utfører command,
  3. Kopierer remote_src til local_dst.

Men hvis command skriver på stdout, resultatet med også være i local_dst. Hvis command leser innspill fra stdin, vil den motta og EOF.

Svar

Mens du kan gjøre dette i en enkelt ssh-økt, er det litt vanskelig å kombinere kopieringsfiler med løpende kommandoer.

Den enkleste måten å takle denne oppgaven på er å kjøre separate SSH-økter for de tre operasjonene:

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

Dette krever autentisering til maskinB tre ganger. anbefalt måte å unngå autentisering flere ganger på er å bruke tilkoblingsdelingsanlegget i moderne versjoner av OpenSSH: start en mastertilkobling til B en gang for alle, og la SSH automatisk rulle inn på den masterforbindelsen. Legg til ControlMaster auto og en ControlPath linje til ~/.ssh/config , start deretter en mastertilkobling i bakgrunnen, og utfør deretter oppgavene dine.

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 stedet for å bruke scp o r rsync for å kopiere filer, kan det være lettere å montere det eksterne filsystemet under SSHFS . Dette vil forresten sørge for å opprette en hovedforbindelse (forutsatt at du har konfigurert ~/.ssh/config som angitt ovenfor).

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 . 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *