如何绕过 ssh_config 中的 RemoteCommand 选项

qme*_*eus 3 ssh rsync ssh-config

我已经定义了一个ssh_config包含我定期连接的所有主机的文件。我喜欢在连接到主机时启动/连接到 tmux 会话,所以我RemoteCommand tmux new -ADs remote在我的配置中添加了这一行。问题是,如果在某个时候我想通过 ssh 使用 rsync(我不时这样做),我会遇到以下错误:

Cannot execute command-line and remote command.
Run Code Online (Sandbox Code Playgroud)

为了解决它,我必须RemoteCommand在我的配置文件中注释掉该行,并且之后不要忘记取消注释它,这有点烦人......

潜在的解决方案(不受欢迎或不起作用):

  • 我曾尝试使用-N表示“不执行远程命令”的标志,但该命令无限期挂起。
  • 我不想在我的配置文件中创建别名主机,因为这意味着条目数量会增加 2 倍,因为只有一个小改动。
  • Match Host不使用 rsync 时,我无法仅执行远程命令

任何人都知道在这种情况下可能对我有帮助的配置技巧或解决方法?

非常感谢!

fra*_*san 14

OpenSSH 7.6开始,ssh有一个RemoteCommand命令行选项。它可用于覆盖 中的相应指令ssh_config。设置为none清除该RemoteCommand参数。

因此,您可以使用ssh -o RemoteCommand=none ...(或者,在您的情况下,可能是rsync -e 'ssh -o RemoteCommand=none' ...)来ssh忽略配置文件中的远程命令集。

至少有几个(当前打开的)错误 报告要求ssh_config命令行上指定的命令(如果有)自动覆盖该设置。


Gil*_*il' 5

不要放入RemoteCommand配置文件。HaveRemoteCommand有时可用于为主机定义别名以ssh myalias运行特定命令。它在通用条目中没有用。正如您所注意到的,除了运行该特定命令之外,它还会阻止执行任何其他操作:您无法使用 rsync、sftp、sshfs,甚至无法以ssh myhost specific-command交互方式运行。

如果你想在连接到主机时默认运行 tmux,有两个明智的解决方案:

一个Match host指令不会帮助,因为你不是在做不同的基于主机名的东西感兴趣。我不认为 ssh 客户端有办法根据命令是否传递给 ssh 来做不同的事情。您可以使用Match exec. 我不认为有一种干净的方法来检测 ssh 是否是用命令调用的,但一种肮脏的方法可能对你来说已经足够了。

Host myhost
Match exec "ps -o args= $PPID | grep -v ' .* '"
    RemoteCommand if [ -t 0 ]; then exec tmux new -ADs remote; fi
Run Code Online (Sandbox Code Playgroud)

如果ssh仅使用主机名而没有选项调用,请运行 tmux。如果ssh使用至少一个选项或除主机名之外的命令调用,RemoteCommand则不应用该指令。如果输入不是来自终端(例如echo ls | ssh myhost),也不要运行 tmux 。这应该处理大多数情况,在不运行 tmux 方面出错(例如ssh -L … myhost不会运行 tmux)。