Hogyan írhatunk egy bash szkriptet, amely egy másik gépre jelentkezik, hogy dolgokat csináljon?

Lehetséges írni egy bash szkriptet, amelyet

  1. az A gépről indítanának, egy másik gépen jelentkezik be B gép ssh által (mind az A, mind a B gép Linux-Machines lenne),
  2. néhány fájlt átmásol a B gépre
  3. egy adott python parancsfájlt futtat egy python szkripten ezeken a gépeken.
  4. visszaviszi az eredményeket az A gépre
  5. kijelentkezik a B gépről.

Ez műszakilag kivitelezhető?

Válasz

Természetesen kivitelezhető:

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

és ez …

De van egy probléma: háromszor kérik meg a jelszót. Annak elkerülése érdekében, hogy generáljon ssh kulcsokat, és engedélyezze a felhasználókat ezekkel a kulcsokkal. kulcsok futtatják az ssh-keygen -t rsa parancsokat, válaszolnak a kérdésekre, és másolják a nyilvános kulcsot a távoli gazdagépre (B gép) ~/.ssh/authorized_keys fájlba. A privát kulcsot a div id = “334398fac8″>

a helyi gépen (A).

Megjegyzések

  • Ha a nyilvános kulcsok adnak opciót, akkor tehet valami nyers dolgot a jelszó-kérések minimalizálása érdekében, például: cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Ha mégis szeretné használni a jelszót, akkor mindig használhatja az OpenSSH ' s kapcsolatkészletet a ControlMaster=yes és ControlPath=/path/to/socketfile, majd indítson el egy ssh kapcsolatot a -f paranccsal a háttér ssh futtatásához. Mondja meg az összes későbbi SSH-kapcsolatnak, hogy ugyanazt a socket fájlt használja.

Válasz

Minden lehetséges egyetlen ssh kapcsolat / munkamenet:

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

Ez:

  1. Másolatok local_srcremote_dst,
  2. végrehajtja a command,
  3. Másolja a remote_src fájlt a local_dst fájlba.

De ha command a stdout oldalon ír, az eredmény pedig a local_dst fájlban is szerepel. Ha command beolvassa a bemenetet a stdin ből, akkor megkapja és EOF.

Válasz

Bár ezt egyetlen ssh munkameneten belül megteheti, kicsit bonyolult a fájlok másolását a futó parancsokkal kombinálni.

A feladat megoldásának legegyszerűbb módja külön SSH munkamenetek futtatása a három művelethez:

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

Ehhez háromszor kell hitelesíteni a machineB-t. A többszörös hitelesítés elkerülésének ajánlott módja a kapcsolatmegosztási lehetőség használata az OpenSSH modern verzióiban: egyszer és mindenkorra indítson master kapcsolatot a B-vel, és hagyja, hogy az SSH automatikusan visszacsatoljon erre a master kapcsolatra. Add ControlMaster auto és egy ControlPath sort az ~/.ssh/config sorba, majd indítson el egy master kapcsolatot a háttérben, majd hajtsa végre a feladatait.

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/ 

Az scp o használata helyett Ha rsync fájlok másolásához, könnyebb lehet a távoli fájlrendszert felcsatolni az SSHFS alá. Ez mellesleg gondoskodni fog a master kapcsolat létrehozásáról (feltéve, hogy “beállította a ~/.ssh/config -t a fentiek szerint).

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 . 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük