Jaka jest odpowiednia opcja .ssh / config dla ssh -N


13

Chcę ustawić alias w moim pliku konfiguracyjnym, który ma taki sam wynik jak to polecenie:

ssh -N devdb -L 1234:127.0.0.1:1234

Mój wpis .ssh / config dla devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Co mam umieścić w powyższej konfiguracji, aby nie uruchamiać powłoki?


+1 za dobre pytanie, które skłoniło mnie do zastanowienia się, jak szybciej tunelować losowe rzeczy (nie robię tego wystarczająco często, aby zapamiętać przełączniki, ale zwykle używam tych samych portów, zmienia się tylko host).
WEBjuju

Odpowiedzi:


22

Tak więc w ssh.cOpenSSH 7.6p1 znajdujemy

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

podobnie -Ndwie rzeczy:

  • no_shell_flagpojawia się tylko w ssh.ci jest dostępna tylko dla -Wlub -Nopcji, w przeciwnym razie pojawi się ona w niektórych bloków logicznych związanych ControlPersisti sprawdzania czystości udziałem widelce tła. Nie widzę sposobu, w jaki opcja mogłaby to bezpośrednio ustawić.
  • zgodnie readconf.cze request_ttyodpowiada RequestTTYopcji wyszczególnionych w ssh_config(5).

To pozostawia (oprócz małpowania łatania OpenSSH i ponownej kompilacji lub proszenia o ssh_configopcję przełączania no_shell_flagz ...) coś takiego:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

Co technicznie powoduje uruchomienie powłoki, ale powłoka ta powinna natychmiast zastąpić się catprogramem, który powinien następnie zablokować, umożliwiając w międzyczasie użycie portu forward. catjest przenośny, ale zużywa dane wejściowe (jeśli takie istnieją) lub może zawieść (jeśli standardowe wejście jest zamknięte). Inną opcją byłoby uruchomienie czegoś, co po prostu blokuje .


1
+1 za zrobienie tego w ciągu .ssh/config... dobra robota!
WEBjuju

Niesamowite badania nad tą odpowiedzią! Dziękuję Ci!
łagodnożółty

Wolę RemoteCommand exec sleep infinity.
Thomas

3

@ thrig ma właściwą odpowiedź na podstawie twojego pragnienia, aby zrobić to wyłącznie wewnątrz .ssh/config

Można również rozważyć użycie funkcji z ustawieniami domyślnymi, aby przyspieszyć wykonywanie innych poleceń tunelu (zwłaszcza jeśli tunel się nie zmienia, a jedynie host).


sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is `sshn` and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

Oto trzy przykłady użycia: bez argumentów używane są wartości domyślne określone w funkcji:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

z domyślnym tunelem uruchom na innym hoście:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

w przypadku obu wartości domyślnych uruchom pełną jednorazową operację na nowym hoście / tunelu:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

Bardziej przydatne zdalne polecenie oparte na odpowiedzi @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

read -r -d '' _Zablokuje połączenia aż prasy użytkownika control+c.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.