.ssh/config 对应 ssh -N 的选项是什么

.ssh/config 对应 ssh -N 的选项是什么

我想在我的配置文件中设置一个别名,其结果与此命令相同:

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.cOpenSSH 7.6p1 中我们发现

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

还有-N两件事:

  • the no_shell_flagonly 出现在并且仅对或选项ssh.c启用,否则它出现在一些与涉及后台分叉的健全性检查相关的逻辑块中。我没有看到选项可以直接设置它的方法。-W-NControlPersist
  • 根据readconf.c对应request_ttyRequestTTY中详细说明的选项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

相关内容