我想在我的配置文件中设置一个别名,其结果与此命令相同:
ssh -N devdb -L 1234:127.0.0.1:1234
我的 .ssh/config 条目devdb
:
Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234
我应该在上面的配置中添加什么才能不启动 shell?
答案1
所以在ssh.c
OpenSSH 7.6p1 中我们发现
case 'N':
no_shell_flag = 1;
options.request_tty = REQUEST_TTY_NO;
还有-N
两件事:
- the
no_shell_flag
only 出现在并且仅对或选项ssh.c
启用,否则它出现在一些与涉及后台分叉的健全性检查相关的逻辑块中。我没有看到选项可以直接设置它的方法。-W
-N
ControlPersist
- 根据
readconf.c
对应request_tty
于RequestTTY
中详细说明的选项ssh_config(5)
。
这留下了(除了猴子修补 OpenSSH 和重新编译,或要求ssh_config
切换选项no_shell_flag
...)类似:
Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234
RequestTTY no
RemoteCommand cat
从技术上讲,它确实启动了一个 shell,但该 shell 应立即用该cat
程序替换自身,然后该程序应阻止允许同时使用端口转发。cat
是可移植的,但会消耗输入(如果有的话)或可能失败(如果标准输入关闭)。另一种选择是运行一些只会阻塞的东西。
答案2
@thrig 根据您仅在内部执行此操作的愿望提供了正确的答案.ssh/config
人们还可以考虑使用具有默认值的函数来快速执行其他隧道命令(特别是如果隧道不更改而仅更改主机)。
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"
}
以下是它的三个使用示例:如果没有参数,则使用函数中指定的默认值:
$ sshn
executing -N devdb -L 1234:127.0.0.1:1234
使用默认隧道,在不同的主机上运行:
$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234
使用这两个默认值,对新主机/隧道运行一次完整的一次性操作:
$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345
答案3
基于@thrig's 答案的更有用的远程命令:
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
。