¿Cuál es la opción correspondiente .ssh / config para ssh -N?

13

Quiero configurar un alias en mi archivo de configuración que tenga el mismo resultado que este comando:

ssh -N devdb -L 1234:127.0.0.1:1234

Mi entrada .ssh / config para devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

¿Qué pongo en la configuración anterior para no iniciar un shell?

mikeb
fuente
+1 para una buena pregunta que me hizo pensar en cómo hacer un túnel a cosas aleatorias más rápido (no lo hago con la frecuencia suficiente para recordar los conmutadores, pero generalmente uso los mismos puertos, solo cambia el host).
WEBjuju
notaverb.com/setup
Monty Harder

Respuestas:

22

Entonces, ssh.cpara OpenSSH 7.6p1 encontramos

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

también lo -Nhacen dos cosas:

  • el no_shell_flagsolo aparece en ssh.cy solo está habilitado para las opciones -Wo -N, de lo contrario, aparece en algunos bloques lógicos relacionados con la ControlPersistverificación de la cordura que implica tenedores de fondo. No veo una forma en que una opción pueda configurarlo directamente.
  • según readconf.cel request_ttycorresponde a la RequestTTYopción detallada en ssh_config(5).

Esto deja (aparte de mono parchear OpenSSH y recompilar, o pedir una ssh_configopción para alternar no_shell_flagcon ...) algo como:

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

Lo que técnicamente inicia un shell, pero ese shell debe reemplazarse de inmediato con el catprograma que luego debe bloquear permitiendo que el puerto hacia adelante se use mientras tanto. cates portátil, pero consumirá entradas (si hay alguna) o podría fallar (si la entrada estándar está cerrada). Otra opción sería ejecutar algo que solo bloquea .

thrig
fuente
1
+1 por hacerlo dentro .ssh/config... ¡bien hecho!
WEBjuju
¡Impresionante investigación sobre esta respuesta! ¡Gracias!
amarillo suave
Yo prefiero RemoteCommand exec sleep infinity.
Thomas
3

@thrig tiene la respuesta correcta basada en su deseo de hacer esto únicamente dentro de .ssh/config

También se podría considerar el uso de una función con valores predeterminados para acelerar otros comandos de túnel (especialmente si el túnel no cambia sino solo el 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"
}

Aquí hay tres ejemplos de su uso: sin argumentos se utilizan los valores predeterminados especificados en la función:

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

con el túnel predeterminado, ejecute en un host diferente:

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

con ambos valores predeterminados, ejecute una única vez en un nuevo host / túnel:

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

Un comando remoto más útil basado en la respuesta de @ 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 '' _'

El read -r -d '' _bloqueará la conexión hasta que el usuario presione control+c.

Tobias Sette
fuente