Was ist die .ssh / config entsprechende Option für ssh -N

13

Ich möchte einen Alias ​​in meiner Konfigurationsdatei einrichten, der das gleiche Ergebnis wie dieser Befehl hat:

ssh -N devdb -L 1234:127.0.0.1:1234

Mein .ssh / config Eintrag für devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Was muss ich in der obigen Konfiguration tun, um eine Shell nicht zu starten?

Mikeb
quelle
+1 für eine gute Frage, die mich dazu brachte, darüber nachzudenken, wie ich das Tunneln zu zufälligen Dingen beschleunigen kann (ich mache es nicht oft genug, um mich an die Switches zu erinnern, aber ich benutze normalerweise die gleichen Ports, es ist nur der Host, der sich ändert).
WEBjuju
notaverb.com/setup
Monty Harder

Antworten:

22

Also ssh.cfür OpenSSH 7.6p1 finden wir

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

Das Gleiche -Ngilt für zwei Dinge:

  • Das wird no_shell_flagnur in ssh.cden Optionen -Woder angezeigt und ist nur für diese aktiviert. -NAndernfalls wird es in einigen Logikblöcken angezeigt, die sich auf die ControlPersistÜberprüfung der Integrität von Hintergrundgabeln beziehen . Ich sehe keinen Weg, wie eine Option sie direkt setzen könnte.
  • nach readconf.cdem request_ttyentspricht die RequestTTYOption detailliert in ssh_config(5).

Dies lässt (abgesehen davon, dass Affen OpenSSH patchen und neu kompilieren oder nach einer ssh_configOption zum Umschalten fragen no_shell_flag...) etwas wie:

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

Was technisch eine Shell startet, aber diese Shell sollte sich sofort durch das catProgramm ersetzen , das dann blockieren sollte, damit die Portweiterleitung in der Zwischenzeit verwendet werden kann. catist portabel, verbraucht aber Eingaben (falls vorhanden) oder kann fehlschlagen (falls die Standardeingabe geschlossen ist). Eine andere Möglichkeit wäre, etwas auszuführen, das nur blockiert .

Thrig
quelle
1
+1 dafür, dass du es innerhalb von .ssh/config... gut gemacht machst !
WEBjuju
Geniale Recherche zu dieser Antwort! Vielen Dank!
Mild-Gelb
Ich ziehe RemoteCommand exec sleep infinity.
Thomas
3

@thrig hat die richtige Antwort, basierend auf Ihrem Wunsch, dies nur innerhalb von zu tun .ssh/config

Man könnte auch in Betracht ziehen, eine Funktion mit Standardeinstellungen zu verwenden, um andere Tunnelbefehle schnell zu machen (insbesondere, wenn sich der Tunnel nicht ändert, sondern nur der 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"
}

Hier sind drei Beispiele für die Verwendung: Ohne Argumente werden die in der Funktion angegebenen Standardwerte verwendet:

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

Führen Sie mit dem Tunnelstandard auf einem anderen Host aus:

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

Führen Sie mit beiden Standardeinstellungen einen vollständigen einmaligen Vorgang auf einem neuen Host / Tunnel aus:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345
WEBjuju
quelle
0

Ein nützlicherer Remote-Befehl basierend auf der Antwort von @ 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 '' _'

Das read -r -d '' _blockiert die Verbindung, bis der Benutzer drückt control+c.

Tobias Sette
quelle