Cum se scrie un script bash, care se conectează la o altă mașină pentru a face lucruri?

Este posibil să scrieți un script bash, ca

  1. să fie pornit de la mașina A, să se conecteze la un alt mașina B de ssh (ambele mașini A și B ar fi Linux-Mașini),
  2. copiază unele fișiere pe mașina B
  3. rulează un script Python un script Python dat pe aceste mașini.
  4. transferă rezultatele înapoi la mașina A
  5. se deconectează de la mașina B.

Este posibil din punct de vedere tehnic?

Răspuns

Desigur, este posibil:

scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./ 

și asta este …

Dar există o problemă: vi se va cere parola de trei ori. Pentru a evita acest lucru, puteți genera chei ssh și autorizați utilizatorii prin aceste chei.

Pentru a genera ssh tastele rulează ssh-keygen -t rsa, răspund la întrebări și copiați cheia publică la gazda la distanță (mașina B) în fișierul ~/.ssh/authorized_keys. Cheia privată trebuie salvată în ~/.ssh/id_rsa pe computerul local (A).

Comentarii

  • Dacă cheile publice nu sunt o opțiune, puteți face ceva grosolan pentru a minimiza solicitările de parolă, cum ar fi cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Dacă faceți acest lucru doriți să utilizați parola, puteți utiliza întotdeauna OpenSSH ' gruparea conexiunilor prin definirea ControlMaster=yes și ControlPath=/path/to/socketfile, apoi începeți o conexiune ssh cu -f pentru a rula un ssh de fundal. Spuneți tuturor conexiunilor SSH ulterioare să utilizeze același fișier socket.

Răspuns

I este posibil să fac totul în o singură ssh conexiune / sesiune:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst 

Aceasta:

  1. Copii local_src la remote_dst,
  2. Execută command,
  3. Copiază remote_src în local_dst.

Dar dacă command scrie pe stdout, rezultatul fiind și în local_dst. Dacă command citește intrarea de la stdin, va primi și EOF.

Răspuns

Deși puteți face acest lucru într-o singură sesiune ssh, este „puțin dificil să combinați copierea fișierelor cu comenzile care rulează.

Cel mai simplu mod de a aborda această sarcină este de a rula sesiuni SSH separate pentru cele trei operații:

rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/ 

Acest lucru necesită autentificarea la machineB de trei ori. modalitatea recomandată de a evita autentificarea de mai multe ori este de a utiliza facilitatea de partajare a conexiunilor în versiunile moderne de OpenSSH: porniți o conexiune master la B odată pentru totdeauna și lăsați SSH să se conecteze automat la acea conexiune master. Adăugați ControlMaster auto și o linie ControlPath la ~/.ssh/config , apoi începeți o conexiune master în fundal, apoi efectuați-vă sarcinile.

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/ 

În loc să utilizați scp o r rsync pentru a copia fișiere, poate fi mai ușor să montați sistemul de fișiere la distanță sub SSHFS . De altfel, acest lucru se va ocupa de configurarea unei conexiuni master (presupunând că „ați configurat ~/.ssh/config așa cum s-a indicat mai sus).

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 . 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *