Jak napisać skrypt bash, który loguje się na innym komputerze, aby robić różne rzeczy?

11

Czy to możliwe, aby napisać skrypt bash

  1. zostałby uruchomiony z komputera A, loguje się na innym komputerze B przez ssh (oba komputery A i B byłyby Linux-Machines),
  2. kopiuje niektóre pliki na komputer B
  3. uruchamia skrypt Python na danym komputerze na danym skrypcie Python.
  4. przesyła wyniki z powrotem do maszyny A
  5. wylogowuje się z komputera B.

Czy to technicznie wykonalne?

Aufwind
źródło

Odpowiedzi:

15

Oczywiście jest to wykonalne:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

i to wszystko...

Ale jest jeden problem: trzy razy zostaniesz poproszony o hasło. Aby tego uniknąć, możesz wygenerować klucze ssh i autoryzować użytkowników za pomocą tych kluczy.

Aby wygenerować uruchamianie kluczy ssh ssh-keygen -t rsa, odpowiedz na pytania i skopiuj klucz publiczny do zdalnego hosta (maszyna B) do ~/.ssh/authorized_keyspliku. Klucz prywatny należy zapisać ~/.ssh/id_rsana komputerze lokalnym (A).

pbm
źródło
Jeśli klucze publiczne nie są opcją, możesz zrobić coś surowego w celu zminimalizowania monitów o hasło, takich jakcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick
Jeśli chcesz użyć hasła, zawsze możesz użyć puli połączeń OpenSSH, definiując ControlMaster=yesi ControlPath=/path/to/socketfile, a następnie nawiązując jedno połączenie ssh z, -faby uruchomić ssh w tle. Poinformuj wszystkie kolejne połączenia SSH, aby używały tego samego pliku gniazda.
jsbillings,
4

Mogę zrobić wszystko w jednym sshpołączeniu / sesji:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

To:

  1. Kopiuje local_srcdo remote_dst,
  2. Wykonuje command,
  3. Kopiuje remote_srcdo local_dst.

Ale jeśli commandpisze dalej stdout, wynik z również będzie local_dst. Jeśli commandodczyta dane wejściowe stdin, otrzyma i EOF.

jfg956
źródło
3

Chociaż możesz to zrobić w ramach jednej sesji ssh, nieco trudniej jest połączyć kopiowanie plików z uruchomionymi poleceniami.

Najłatwiejszym sposobem rozwiązania tego zadania jest uruchomienie osobnych 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 na komputerze B. Zalecanym sposobem uniknięcia wielokrotnego uwierzytelniania jest skorzystanie z funkcji współdzielenia połączenia w nowoczesnych wersjach OpenSSH: nawiąż połączenie główne z B raz na zawsze i pozwól SSH automatycznie nałożyć połączenie na to połączenie główne. Dodaj ControlMaster autoi dodaj ControlPathdo swojego~/.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 lub rsync do kopiowania plików, łatwiej jest zamontować zdalny system plików w SSHFS . Nawiasem mówiąc, zajmie się to ustanowieniem połączenia głównego (zakładając, że skonfigurowałeś swoje, ~/.ssh/configjak 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 .
Gilles „SO- przestań być zły”
źródło