Je možné napsat bash skript, který
- by byl spuštěn ze stroje A, přihlásí se na jiném machine B by ssh (both machines A and B would be Linux-Machines),
- copys some files on to machine B
- runs a python script a given python script on these machines.
- přenáší výsledky zpět do stroje A
- odhlásí se ze stroje B.
Je to technicky možné?
Odpověď
Samozřejmě je to možné:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
a to je vše …
Ale je tu jeden problém: budete požádáni o heslo třikrát. Abyste se vyhnuli tomu, že byste mohli generovat klíče ssh a autorizovat uživatele pomocí těchto klíčů.
Chcete-li vygenerovat ssh klíče běží ssh-keygen -t rsa
, odpovídají na otázky a zkopírují veřejný klíč na vzdáleného hostitele (stroj B) do ~/.ssh/authorized_keys
souboru. Soukromý klíč by měl být uložen v ~/.ssh/id_rsa
na místním počítači (A).
Komentáře
Odpověď
Je možné udělat vše v jediné ssh
připojení / relace:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
Toto:
- kopie
local_src
toremote_dst
, - Spustí
command
, - Zkopíruje
remote_src
dolocal_dst
.
Ale pokud command
píše stdout
, výsledek musí být také v local_dst
. Pokud command
načte vstup z stdin
, přijme a EOF
.
Odpověď
I když to můžete udělat v rámci jedné relace ssh, je trochu složité kombinovat kopírování souborů se spuštěnými příkazy.
Nejjednodušší způsob, jak tento úkol vyřešit, je spustit samostatné relace SSH pro tyto tři operace:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
To vyžaduje ověření na stroji B třikrát. doporučeným způsobem, jak se vyhnout vícenásobnému ověření, je použít v moderních verzích OpenSSH možnost sdílení připojení: jednou navždy spustit hlavní připojení k B a nechat SSH automaticky navazovat na toto hlavní připojení. Přidejte ControlMaster auto
a řádek ControlPath
do svého ~/.ssh/config
, poté spusťte hlavní připojení na pozadí a poté proveďte své úkoly.
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/
Spíše než používat scp o Pokud chcete kopírovat soubory, může být snazší připojit vzdálený souborový systém pod SSHFS . Tím se mimochodem postaráme o nastavení hlavního připojení (za předpokladu, že jste nastavili ~/.ssh/config
jak je uvedeno výše).
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
aControlPath=/path/to/socketfile
a poté spusťte jedno připojení ssh pomocí-f
a spusťte pozadí ssh. Řekněte všem dalším připojením SSH, aby používaly stejný soubor soketu.