Er det mulig å skrive et bash-skript, at
- 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),
- kopierer noen filer videre til maskin B
- kjører et pythonscript et gitt pythonscript på disse maskinene.
- overfører resultatene tilbake til maskin A
- 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
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:
- Kopier
local_srctilremote_dst, - Utfører
command, - Kopierer
remote_srctillocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/resultsControlMaster=yesogControlPath=/path/to/socketfile, og start deretter en ssh-forbindelse med-ffor å kjøre en bakgrunns-ssh. Be alle påfølgende SSH-tilkoblinger bruke den samme sokkelfilen.