Er det muligt at skrive et bash-script, at
- startes fra maskine A, logger ind på en anden maskine B af ssh (begge maskiner A og B ville være Linux-maskiner),
- kopierer nogle filer videre til maskine B
- kører et pythonscript et givet pythonscript på disse maskiner.
- overfører resultaterne tilbage til maskine A
- logger af fra maskine B.
Er dette teknisk gennemførligt?
Svar
Det er selvfølgelig muligt:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
og det er det …
Men der er et problem: du bliver bedt om adgangskode tre gange. For at undgå at du kunne generere ssh-nøgler og autorisere brugere med disse nøgler.
At generere ssh nøgler kører ssh-keygen -t rsa, besvar spørgsmål og kopier offentlig nøgle til ekstern vært (maskine B) til ~/.ssh/authorized_keys -fil. Privat nøgle skal gemmes i ~/.ssh/id_rsa på lokal maskine (A).
Kommentarer
Svar
Jeg kan gøre alt i en enkelt ssh forbindelse / session:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Dette:
- Kopier
local_srctilremote_dst, - Udfører
command, - Kopierer
remote_srctillocal_dst.
Men hvis command skriver på stdout, resultatet med også at være i local_dst. Hvis command læser input fra stdin, modtager den og EOF.
Svar
Mens du kan gøre dette inden for en enkelt ssh-session, er det lidt vanskeligt at kombinere kopiering af filer med kørende kommandoer.
Den nemmeste måde at tackle denne opgave på er at køre separate SSH-sessioner for de tre operationer:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Dette kræver godkendelse til maskine B tre gange. anbefalet måde at undgå autentificering flere gange på er at bruge forbindelsesdelingsfaciliteten i moderne versioner af OpenSSH: start en mastertilslutning til B en gang for alle, og lad SSH automatisk piggyback på den masterforbindelse. Føj ControlMaster auto og en ControlPath linje til din ~/.ssh/config , start derefter en masterforbindelse i baggrunden, og udfør derefter dine opgaver.
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 at bruge scp o r rsync for at kopiere filer, kan det være lettere at montere det eksterne filsystem under SSHFS . Dette sørger forresten af opsætning af en masterforbindelse (forudsat at du “har opsat din ~/.ssh/config som angivet 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 derefter en ssh-forbindelse med-ffor at køre en baggrundshsh. Bed alle efterfølgende SSH-forbindelser om at bruge den samme sokkelfil.