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_src
tilremote_dst
, - Utfører
command
, - Kopierer
remote_src
tillocal_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/results
ControlMaster=yes
ogControlPath=/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.