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
表示“不执行远程命令”的标志,但该命令无限期挂起。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
命令行上指定的命令(如果有)自动覆盖该设置。
不要放入RemoteCommand
配置文件。HaveRemoteCommand
有时可用于为主机定义别名以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
}
Run Code Online (Sandbox Code Playgroud)
一个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)。