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_src
toremote_dst
, - Wykonuje
command
, - Kopiuje
remote_src
dolocal_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/results
ControlMaster=yes
iControlPath=/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.