Este posibil să scrieți un script bash, ca
- 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),
- copiază unele fișiere pe mașina B
- rulează un script Python un script Python dat pe aceste mașini.
- transferă rezultatele înapoi la mașina A
- 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
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:
- Copii
local_src
laremote_dst
, - Execută
command
, - Copiază
remote_src
înlocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
șiControlPath=/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.