Jak napsat bash skript, který se přihlásí na jiný stroj, aby dělal věci?

Je možné napsat bash skript, který

  1. 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),
  2. copys some files on to machine B
  3. runs a python script a given python script on these machines.
  4. přenáší výsledky zpět do stroje A
  5. 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

  • Pokud veřejné klíče nejsou dostupné, můžete udělat něco hrubého, abyste minimalizovali výzvy k zadání hesla, jako je cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Pokud ano chcete-li použít heslo, můžete vždy použít sdružení připojení OpenSSH ' definováním ControlMaster=yes a ControlPath=/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.

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:

  1. kopie local_src to remote_dst,
  2. Spustí command,
  3. Zkopíruje remote_src do local_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 . 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *