我已经定义了一个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.6,ssh
有一个RemoteCommand
命令行选项。它可用于覆盖 中的相应指令ssh_config
。设置为none
清除该RemoteCommand
参数。
因此,您可以使用ssh -o RemoteCommand=none ...
(或者,在您的情况下,可能是rsync -e 'ssh -o RemoteCommand=none' ...
)来ssh
忽略配置文件中的远程命令集。
答案2
不要放入RemoteCommand
配置文件中。有时,为运行特定命令RemoteCommand
的主机定义别名很有用。ssh myalias
它在通用条目中没有用处。正如您所注意到的,它会阻止执行除运行该特定命令之外的任何操作:您无法使用 rsync、sftp、sshfs,甚至无法ssh myhost specific-command
交互运行。
如果您想在连接到主机时默认运行 tmux,有两种明智的解决方案:
在服务器上,编辑您的
.profile
或类似的登录时脚本(.zprofile
、.config/fish/config.ish
、.login
、 …)以在交互登录时运行 tmux。参见例如通过 SSH 连接后如何立即运行脚本?,在 ssh 登录时运行 tmux。在客户端上,定义一个
ssh
运行 tmux 的包装器。例如 shell 函数:tsh () { ssh "$@" tmux new -ADs remote }
指令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。