Korzystanie z już ustanowionego kanału SSH

50

Mam już ustanowione połączenie ssh między dwiema maszynami.

Czy istnieje sposób na wysyłanie poleceń do zdalnego komputera ze skryptu powłoki, który jest uruchamiany na komputerze lokalnym, używając już otwartego połączenia i bez rozpoczynania kolejnej sesji ssh?

SWeko
źródło

Odpowiedzi:

56

Jest to bardzo proste dzięki wystarczającej liczbie najnowszych wersji OpenSSH, jeśli planujesz z wyprzedzeniem.

Otwórz połączenie główne za pierwszym razem. W przypadku kolejnych połączeń trasuj połączenia podrzędne przez istniejące połączenie główne. W swoim ~/.ssh/configustaw, aby udostępnianie połączenia odbywało się automatycznie:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Jeśli rozpoczniesz sesję ssh do tego samego (użytkownika, portu, komputera) co istniejące połączenie, druga sesja zostanie tunelowana w pierwszej. Nawiązanie drugiego połączenia nie wymaga nowego uwierzytelnienia i jest bardzo szybkie.

Gilles „SO- przestań być zły”
źródło
Wygląda na to, że drugi nie zostanie zarejestrowany w / var / log / secure lub /var/log/auth.log. Czy jednak drugi zostanie zarejestrowany w / var / log / wtmp?
SOUser
@XichenLi /var/log/securei /var/log/auth.logzaloguj połączenia SSH; połączenie podrzędne nie pojawia się tam, ponieważ łączy się z istniejącym połączeniem. Jeśli twoja sesja ssh przydzieli terminal (tj. ssh somehostBez dostarczonej komendy, lub ssh -t), to jest (normalnie) zalogowany wtmp, niezależnie od tego, jak ten terminal się pojawił (sshd niezależnie od metody użytej do nawiązania połączenia, aplikacja emulatora terminala,…).
Gilles „SO- przestań być zły”
2
Możesz także użyć ControlPersist 600opóźnienia w sekundach, gdy gniazdo jest w stanie bezczynności, zanim zostanie automatycznie usunięte. W przeciwnym razie nastąpi automatyczne zamknięcie po zakończeniu połączenia głównego. To nie jest dobre do zdalnego wykonywania szeregu poleceń (np.
2
Jeśli nie chcesz edytować konfiguracji globalnej, możesz również użyć opcji -S(określ gniazdo) i -M(utwórz połączenie główne) klienta SSH.
yankee
22

Jest to dość łatwe do osiągnięcia przy użyciu narzędzia NC i tuneli ssh.

1. Otwórz tunel ssh

W sesji ssh wpisz ~Cnowy wiersz. Otrzymasz monit ssh „konsola serwisowa”, który wygląda następująco:

ssh> 

Wpisz polecenie lokalnego przekazywania, aby otworzyć tunel ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Gdzie targethostjest nazwa hosta lub adres IP urządzenia, z którym jesteś podłączony.

Teraz, zakładając, że serwer ssh na maszynie docelowej nie został skonfigurowany do zakazania tuneli, masz pożądane przekierowanie połączenia: sshklient na twoim komputerze nasłuchuje na porcie 22000 i przekieruje wszelki ruch wysłany do niego do portu 22001 na targethost.

2. Uruchom serwer sieciowy na zdalnym komputerze

Jest to tak proste, jak wprowadzenie do już otwartej sesji ssh następującego polecenia:

remote$ nc -l localhost 22001 | sh

Spowoduje to uruchomienie serwera TCP nasłuchującego na porcie 22001 - który jest portem docelowym naszego tunelu ssh - i przekieruje otrzymane dane (prawdopodobnie polecenia powłoki) do targethostinstancji powłoki.

3. Wyślij skrypt przez tunel

local$ cat yourscript.sh | nc localhost 22000

Spowoduje to wysłanie ciała skryptu do tunelu ssh i zakończy się jego wykonaniem w powłoce na targethost. Zobaczysz wyjście skryptu w swoim terminalu z sesją ssh.


Zwrócę też uwagę, że tunel ssh (krok 1.) w tym scenariuszu nie jest ściśle wymagany; równie dobrze możesz uruchomić serwer otwarty i połączyć się z nim bezpośrednio przez Internet. Musisz jednak skorzystać z tunelu, jeśli docelowy host nie może być osiągnięty bezpośrednio (np. Jest za NAT) lub wymagane jest szyfrowanie ssh.

ulidtko
źródło
3
Świetna odpowiedź. Technicznie rzecz biorąc, aby dostać się do konsoli serwisowej, ~postać musi przyjść po nowej linii, więc LF ~ Cprawdopodobnie jest to lepsza sekwencja.
Alexios
@Alexios, poprawne.
ulidtko
Niesamowita sztuczka! Dla przypomnienia strona man ssh zawiera więcej informacji na ten temat (przewiń w dół do sekcji o nazwie „UCIECZKI UCIECZKI”)
Carles Sala
@ CarlesSala również warto wiedzieć less, że zwykły domyślny pager obsługuje wyszukiwanie, które pozwala zaoszczędzić przewijanie, jeśli znasz słowa kluczowe: po prostu wpisz man ssh /ESCAPEi już tam jesteś.
ulidtko
@ulidtko na pewno, ale o ile mi wiadomo, nie można połączyć polecenia CLI z komentarzem SO, więc znalazłem stronę podręcznika HTML lepszą opcją ;-)
Carles Sala