Czy można napisać skrypt bash, który
- byłby uruchamiany z komputera A, loguje się na innym maszyna B przez ssh (oba komputery A i B byłyby Linux-Machines),
- kopiuje niektóre pliki na maszynę B
- uruchamia skrypt Pythona na tych maszynach dany skrypt Pythona.
- przesyła wyniki z powrotem do komputera A
- wylogowuje się z komputera B.
Czy jest to technicznie wykonalne?
Odpowiedź
Oczywiście, że jest wykonalne:
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
i to wszystko …
Ale jest jeden problem: zostaniesz poproszony o hasło trzy razy. Aby tego uniknąć, możesz wygenerować klucze ssh i autoryzować użytkowników za pomocą tych kluczy.
Aby wygenerować ssh uruchamianie kluczy ssh-keygen -t rsa, odpowiadanie na pytania i kopiowanie klucza publicznego na zdalny host (komputer B) do pliku ~/.ssh/authorized_keys. Klucz prywatny należy zapisać w ~/.ssh/id_rsa na komputerze lokalnym (A).
Komentarze
Odpowiedź
Wszystko mogę zrobić w pojedyncze ssh połączenie / sesja:
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
To:
- Kopie
local_srctoremote_dst, - Wykonuje
command, - Kopiuje
remote_srcdolocal_dst.
Ale jeśli command zapisuje na stdout, wynik z również znajduje się w local_dst. Jeśli command odczyta dane wejściowe z stdin, otrzyma i EOF.
Odpowiedź
Chociaż możesz to zrobić w ramach pojedynczej sesji ssh, połączenie kopiowania plików z uruchomionymi poleceniami jest trochę trudne.
Najłatwiejszym sposobem wykonania tego zadania jest uruchomienie oddzielnych sesji SSH dla trzech operacji:
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
Wymaga to trzykrotnego uwierzytelnienia w urządzeniu B. Zalecanym sposobem uniknięcia wielokrotnego uwierzytelniania jest skorzystanie z funkcji udostępniania połączenia we współczesnych wersjach OpenSSH: uruchom połączenie główne z B raz na zawsze i pozwól SSH automatycznie przejść do tego połączenia głównego. Dodaj linię ControlMaster auto i ControlPath do swojej ~/.ssh/config , następnie uruchom połączenie główne w tle, a następnie wykonaj swoje zadania.
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/
Zamiast używać scp o r rsync do kopiowania plików, może być łatwiejsze zamontowanie zdalnego systemu plików w SSHFS . To zajmie się konfiguracją połączenia głównego (zakładając, że „skonfigurowałeś ~/.ssh/config jak wskazano powyżej).
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=yesiControlPath=/path/to/socketfile, a następnie uruchom jedno połączenie ssh za pomocą-f, aby uruchomić ssh w tle. Powiedz wszystkim kolejnym połączeniom SSH, aby używały tego samego pliku gniazda.