Он двоичный. Окончательным показателем этого является тот факт, что он не позволит вам выгружать двоичные данные в стандартный вывод с сообщением об ошибке:
# ip route save
Not sending binary stream to stdout
Dump terminated
Así que en ssh.c
para OpenSSH 7.6p1 encontramos
case 'N':
no_shell_flag = 1;
options.request_tty = REQUEST_TTY_NO;
entonces -N
hace dos cosas:
no_shell_flag
solo aparece en ssh.c
y solo está habilitado para las opciones -W
o -N
; de lo contrario, aparece en algunos bloques lógicos relacionados con ControlPersist
y la verificación de cordura que involucra bifurcaciones en segundo plano. No veo una forma en que una opción pueda establecerlo directamente. readconf.c
el request_tty
corresponde a la opción RequestTTY
detallada en ssh_config(5)
. Esto deja (aparte de parchear OpenSSH y recompilar, o solicitar una opción ssh_config
para alternar no_shell_flag
con... )algo así 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 debería reemplazarse inmediatamente con el programa cat
que luego debería bloquearse y permitir que el reenvío de puertos se use mientras tanto. cat
es portátil, pero consumirá la entrada (si hay alguna )o podría fallar (si la entrada estándar está cerrada ). Otra opción sería ejecutar algo que simplemente bloquee .
@thrig tiene la respuesta correcta según su deseo de hacer esto únicamente dentro de.ssh/config
También se podría considerar usar una función con valores predeterminados para hacer que otros comandos de túnel sean rápidos (, 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 en 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 túnel predeterminado, ejecutar en un host diferente:
$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234
con ambos valores predeterminados, ejecute uno completo -a un nuevo host/túnel:
$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345
Более полезная удаленная команда, основанная на ответе @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 '' _
будет блокировать соединение, пока пользователь не нажмет control+c
.