Hvordan skriver man et bash-script, der logger på en anden maskine for at gøre ting?

Er det muligt at skrive et bash-script, at

  1. startes fra maskine A, logger ind på en anden maskine B af ssh (begge maskiner A og B ville være Linux-maskiner),
  2. kopierer nogle filer videre til maskine B
  3. kører et pythonscript et givet pythonscript på disse maskiner.
  4. overfører resultaterne tilbage til maskine A
  5. 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

  • Hvis offentlige nøgler ikke er en mulighed, kan du gøre noget groft for at minimere adgangskodeanmodninger som cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Hvis du gør ønsker at bruge adgangskoden, kan du altid bruge OpenSSH ' s forbindelsespooling ved at definere ControlMaster=yes og ControlPath=/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.

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:

  1. Kopier local_src til remote_dst,
  2. Udfører command,
  3. Kopierer remote_src til local_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 . 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *