Qual è l'opzione corrispondente .ssh / config per ssh -N


13

Voglio impostare un alias nel mio file di configurazione che abbia lo stesso risultato di questo comando:

ssh -N devdb -L 1234:127.0.0.1:1234

La mia voce .ssh / config per devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Cosa devo inserire nella configurazione sopra per non avviare una shell?


+1 per una buona domanda che mi ha fatto pensare a come velocizzare il tunneling a cose casuali (non lo faccio abbastanza spesso per ricordare gli switch, ma di solito utilizzo le stesse porte, è solo l'host che cambia).
WEBjuju,

Risposte:


22

Quindi in ssh.cOpenSSH 7.6p1 troviamo

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

così -Nfa due cose:

  • l' no_shell_flagunico appare in ssh.ced è abilitato solo per le opzioni -Wo -N, altrimenti appare in alcuni blocchi logici relativi al ControlPersistcontrollo di integrità che coinvolgono forcelle in background. Non vedo un modo in cui un'opzione potrebbe impostarla direttamente.
  • secondo readconf.cle request_ttycorrisponde alla RequestTTYopzione dettagliato in ssh_config(5).

Questo lascia (a parte la scimmia che corregge OpenSSH e ricompila, o chiede ssh_configun'opzione per alternare no_shell_flagcon ...) qualcosa del tipo:

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

Che tecnicamente avvia una shell ma quella shell dovrebbe immediatamente sostituirsi al catprogramma che dovrebbe quindi bloccarsi consentendo nel frattempo di utilizzare il port forward. catè portatile, ma consumerà input (se presente) o potrebbe non funzionare (se input standard è chiuso). Un'altra opzione sarebbe quella di eseguire qualcosa che blocchi .


1
+1 per averlo fatto entro .ssh/config... ben fatto!
WEBjuju,

Fantastica ricerca su questa risposta! Grazie!
giallo intenso

Io preferisco RemoteCommand exec sleep infinity.
Thomas,

3

@thrig ha la risposta giusta in base al tuo desiderio di farlo esclusivamente all'interno .ssh/config

Si potrebbe anche considerare l'utilizzo di una funzione con valori predefiniti per rendere veloci altri comandi del tunnel (specialmente se il tunnel non cambia ma solo l'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"
}

Ecco tre esempi in uso: senza argomenti vengono utilizzati i valori predefiniti specificati nella funzione:

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

con tunnel predefinito, esegui su un host diverso:

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

con entrambe le impostazioni predefinite, esegui una tantum completo su un nuovo host / tunnel:

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

0

Un comando remoto più utile basato sulla risposta di @ 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 '' _'

Il read -r -d '' _bloccherà la connessione fino a quando l'utente preme control+c.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.