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_src
tilremote_dst
, - Udfører
command
, - Kopierer
remote_src
tillocal_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/results
ControlMaster=yes
ogControlPath=/path/to/socketfile
, og start derefter en ssh-forbindelse med-f
for at køre en baggrundshsh. Bed alle efterfølgende SSH-forbindelser om at bruge den samme sokkelfil.