Kuinka kirjoittaa bash-komentosarja, joka kirjautuu toiseen koneeseen tekemään asioita?

Onko mahdollista kirjoittaa bash-komentosarja, joka

  1. aloitettaisiin koneelta A, kirjautuu sisään eri kone B ssh: llä (molemmat koneet A ja B olisivat Linux-koneita),
  2. kopioi joitain tiedostoja koneeseen B
  3. suorittaa python-komentosarjan tietyllä python-komentosarjalla näillä koneilla.
  4. siirtää tulokset takaisin koneelle A
  5. kirjautuu ulos koneelta B.

Onko tämä teknisesti toteutettavissa?

Vastaus

Se on tietysti toteutettavissa:

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

ja se …

Mutta on yksi ongelma: Sinulta kysytään salasanaa kolme kertaa. Voit välttää sen, että voisit luoda ssh-avaimia ja valtuuttaa käyttäjät näillä avaimilla.

Ssh: n luominen avaimet suorittavat ssh-keygen -t rsa, vastaavat kysymyksiin ja kopioivat julkisen avaimen etäisäntään (kone B) ~/.ssh/authorized_keys -tiedostoon. Yksityinen avain tulisi tallentaa ~/.ssh/id_rsa paikallisessa koneessa (A).

Kommentit

  • Jos julkiset avaimet tarjoavat vaihtoehdon, voit tehdä jotain karkeaa salasanakehotteiden minimoimiseksi, kuten cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Jos et haluat käyttää salasanaa, voit aina käyttää OpenSSH ' -yhteyspoolia määrittelemällä ControlMaster=yes ja ControlPath=/path/to/socketfile ja aloita sitten yksi ssh-yhteys -f -toiminnolla taustan ssh: n suorittamiseksi. Käske kaikkia seuraavia SSH-yhteyksiä käyttämään samaa socket-tiedostoa.

Vastaa

Voin tehdä kaiken yksittäinen ssh yhteys / istunto:

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

Tämä:

  1. Kopiot local_srcremote_dst,
  2. Suorittaa command,
  3. Kopioi remote_src tiedostoon local_dst.

Mutta jos command kirjoittaa stdout, tuloksen on oltava myös local_dst. Jos command lukee syötteen osoitteesta stdin, se vastaanottaa ja EOF.

vastaus

Vaikka voit tehdä tämän yhden ssh-istunnon sisällä, on hieman hankalaa yhdistää tiedostojen kopiointi käynnissä oleviin komentoihin.

Helpoin tapa hoitaa tämä tehtävä on suorittaa erilliset SSH-istunnot kolmelle operaatiolle:

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

Tämä edellyttää todennusta machineB: lle kolme kertaa. suositeltava tapa välttää todennusta useita kertoja on käyttää yhteyden jakamismahdollisuutta OpenSSH: n nykyaikaisissa versioissa: aloita master-yhteys B: hen lopullisesti ja anna SSH: n automaattisesti olla kiinni kyseisessä pääyhteydessä. Lisää ControlMaster auto ja ControlPath -rivi ~/.ssh/config , muodosta sitten pääyhteys taustalla ja suorita sitten tehtävät.

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/ 

Sen sijaan, että käyttäisit scp o: ta Kun tiedostot kopioidaan rsynkronoituna, etätiedostojärjestelmän asentaminen SSHFS: n alle voi olla helpompaa. Tämä huolehtii muuten pääyhteyden muodostamisesta (olettaen, että olet määrittänyt ~/.ssh/config kuten yllä on mainittu).

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 . 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *