Lehetséges írni egy bash szkriptet, amelyet
- 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),
- néhány fájlt átmásol a B gépre
- egy adott python parancsfájlt futtat egy python szkripten ezeken a gépeken.
- visszaviszi az eredményeket az A gépre
- 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
Válasz
Minden lehetséges egyetlen ssh
kapcsolat / munkamenet:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Ez:
- Másolatok
local_src
–remote_dst
, - végrehajtja a
command
, - Másolja a
remote_src
fájlt alocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
ésControlPath=/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.