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_srctoremote_dst, - Spustí
command, - Zkopíruje
remote_srcdolocal_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/resultsControlMaster=yesaControlPath=/path/to/socketfilea poté spusťte jedno připojení ssh pomocí-fa spusťte pozadí ssh. Řekněte všem dalším připojením SSH, aby používaly stejný soubor soketu.