如何绕过 ssh_config 中的 RemoteCommand 选项

如何绕过 ssh_config 中的 RemoteCommand 选项

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

Cannot execute command-line and remote command.

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

潜在的解决方案(不需要或不起作用):

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

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

非常感谢!

答案1

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

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

至少有几个(目前开放)漏洞 报告ssh_config要求命令行中指定的命令(如果有)自动覆盖设置。

答案2

不要放入RemoteCommand配置文件中。有时,为运行特定命令RemoteCommand的主机定义别名很有用。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

如果ssh仅使用主机名且没有选项来调用,则运行 tmux。如果ssh除了主机名之外还使用至少一个选项或命令来调用,RemoteCommand则不会应用该指令。如果输入不是来自终端(例如echo ls | ssh myhost),也不要运行 tmux。这应该可以解决大多数情况,避免不运行 tmux(例如,ssh -L … myhost不运行 tmux)。

答案3

我用在我的 *nix 客户端上允许对所有交互式 shell 进行 RemoteCommand'ing tmux/screen,同时不是当在命令行上传递 RemoteCommand 时执行此操作。

Host MYHOST exec "[[ $(ps h o args p $PPID | wc -w) -eq 2 ]]"
    # matches `ssh <server>` but not `ssh <server> <cmd>`
    Hostname MYHOST.LAN
    User root
    RequestTTY force
    RemoteCommand tmux ls | grep -v attached && tmux attach || tmux new
Host MYHOST
    # matches `ssh <server> <cmd>`
    Hostname MYHOST.LAN
    User root

我还没有弄清楚如何使用 OpenSSH for Windows 来做到这一点。如果您知道如何操作,请发表评论并告诉我。

答案4

我在这里看到了另一种可能的解决方案。您可以将其添加到 .ssh/config 文件末尾的某个位置:

Host *-tmux
  RemoteCommand tmux new -ADs remote

这样您的配置中就只有一个附加条目。您可以使用“ssh hostx-tmux”进行连接(运行tmux),并使用例如“rsync hostx”而不运行tmux。

相关内容