Czy mogę sprawić, że SSH zawiedzie, gdy przekierowanie portu się nie powiedzie?

39

Jeśli wykonam przekierowanie portu zdalnego, a la, -R 3690:localhost:3690gdy już istnieje powiązanie na porcie na hoście zdalnym , pojawia się następujące ostrzeżenie:

Warning: remote port forwarding failed for listen port 3690

Czy istnieje sposób, aby ssh się nie powiódł (tzn. Wyjść z niezerowym kodem powrotu), zamiast po prostu emitować ostrzeżenie?

Matt Joiner
źródło
Czy faktycznie musisz stworzyć kanał terminalowy, czy tylko przekazywanie?
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Tylko przekazywanie.
Matt Joiner,

Odpowiedzi:

63

Biegać

ssh -o "ExitOnForwardFailure yes" ...

lub umieścić

ExitOnForwardFailure yes

w ~/.ssh/config. Zobacz man ssh_configszczegóły.

Andrew Schulman
źródło
Niestety mam OpenSSH 4. Czy możesz mi powiedzieć, kiedy ta funkcja została dodana?
Matt Joiner,
2
Nie, nie wiem tego. Może to być funkcja wersji 5. Ale wersja 4 musi mieć teraz wiele lat i cały czas są poprawki bezpieczeństwa . Jeśli nie możesz samodzielnie zaktualizować serwera, możesz zapytać administratora serwera, czy uważa, że ​​korzystanie z tej wersji jest bezpieczne.
Andrew Schulman,
Pamiętaj, że jeśli nie określisz jawnie, bind_addressssh może nadal nie zawieść. Na przykład, jeśli inny użytkownik już nasłuchuje na lokalnym hoście ipv6, [::1]:3690ssh może powiązać tylko ipv4 127.0.0.1:3690i nie narzeka. Ale twój klient svn prawdopodobnie wolałby gniazdo ipv6 (atakującego). Aby być bezpiecznym, lepiej używać-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier
3
Można również użyć ssh -o ExitOnForwardFailure = yes, aby uniknąć białych znaków i konieczności cytowania.
spacja
1

Używam skryptu bash na hoście docelowym, aby upewnić się, że przekazywanie zostało poprawnie otwarte. Połączenie SSH uruchomi to i zakończy działanie, jeśli wystąpi problem z przekierowaniem portów, np

skrypt po stronie klienta: (używa ustawień .ssh / config do ustawień przekierowania portów)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

skrypt po stronie serwera (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Może nawet uruchom skrypt po stronie klienta pod ekranem za pomocą -dmS

Antti Rytsölä Circles Consult
źródło
2
W przypadku, którego próbuję uniknąć, port przekierowania już istnieje i pojawia się ostrzeżenie. Myślę, że ten skrypt potraktuje istniejące powiązanie z portem raczej jako sukces, niż niepowodzenie.
Matt Joiner
1
To prawda. Mój problem polegał na tym, że ten sam skrypt trzymał port otwarty przez kilka minut, zanim upłynął limit czasu. Skrypt Thsi zamyka się i uruchamia kilka razy, po czym port będzie ponownie otwarty. Jeśli chcesz wiedzieć na pewno, kto jest właścicielem portu, możesz spróbować uruchomić netstat -anp z sudo i grep.
Antti Rytsölä Circles Skonsultuj się
@ AnttiRytsöläCirclesConsult: Należy pamiętać, że może być konieczne sprawdzenie identyfikatora procesu, ponieważ np. Dopasowanie „ssh”, ponieważ nazwa procesu nadal nie informuje, który z klientów SSH aktualnie przekierowuje ten port.
Piskvor