Jak napisać skrypt basha, który loguje się na inną maszynę, aby coś zrobić?

Czy można napisać skrypt bash, który

  1. byłby uruchamiany z komputera A, loguje się na innym maszyna B przez ssh (oba komputery A i B byłyby Linux-Machines),
  2. kopiuje niektóre pliki na maszynę B
  3. uruchamia skrypt Pythona na tych maszynach dany skrypt Pythona.
  4. przesyła wyniki z powrotem do komputera A
  5. 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

  • Jeśli klucze publiczne nie wchodzą w grę, możesz zrobić coś prymitywnego, aby zminimalizować monity o hasło, na przykład cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Jeśli to zrobisz chcesz użyć hasła, zawsze możesz użyć puli połączeń OpenSSH ', definiując ControlMaster=yes i ControlPath=/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.

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:

  1. Kopie local_src to remote_dst,
  2. Wykonuje command,
  3. Kopiuje remote_src do local_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 . 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *