我正在尝试设置 SSH 多路复用,但遇到了错误,并且在 Google 上搜索到的确切错误消息目前为止只有 0 次。
我~/.ssh/config
用以下内容创建:
Host *
ControlPath ~/.ssh/master-%r@%h:%p
然后,我通过运行以下命令创建了主连接:
ssh -vMM [email protected]
这似乎成功创建了多路复用套接字:
...
Authenticated to host.example.com ([1.2.3.4]:22).
debug1: setting up multiplex master socket
debug1: channel 0: new [/home/user/.ssh/[email protected]:22]
debug1: channel 1: new [client-session]
debug1: Entering interactive session.
...
然后,我尝试在另一个窗口中通过 ssh 运行命令:
ssh -v [email protected] ls
然而,这似乎无法使用多路复用套接字:
OpenSSH_7.5p1, OpenSSL 1.1.0f 25 May 2017
debug1: Reading configuration data /home/user/.ssh/config
debug1: /home/user/.ssh/config line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
Master refused session request: Permission denied
debug1: Connecting to host.example.com [1.2.3.4] port 22.
...
什么可能导致Master refused session request: Permission denied
错误发生?
~/.ssh
编辑:和的权限~/.ssh/config
分别为 700 和 644,所以我没有看到那里的问题。~/.ssh/master-*
不存在,我猜它是一个抽象的 UNIX 套接字(因此实际上并不存在于文件系统中)?但是,这仍然不能解释“访问被拒绝”错误。
另外,我注意到,当尝试建立第二个连接时,主连接会打印:
debug1: channel 2: new [mux-control]
debug1: permanently_drop_suid: 0
ssh_askpass: exec(/usr/lib/ssh/ssh-askpass): No such file or directory
debug1: channel 2: free: mux-control, nchannels 3
也许这有关系。我使用未加密的 SSH 密钥进行连接,所以我不明白为什么 SSH 需要要求输入密码。
答案1
我已经找出导致“访问被拒绝”错误的原因。
默认情况下,当另一个 SSH 进程想要使用现有的 Multiplex 会话时,SSH 似乎希望以交互方式请求许可。但是,ssh-askpass
我的系统上缺少用于请求权限的程序,因此 SSH 默认为“否,不授予访问权限”,从而导致客户端出现“访问被拒绝”错误消息。
如果ssh-askpass
已安装(位于包裹x11-ssh-askpass
在 Arch Linux 上),然后将显示如下对话框:
选择“确定”将允许连接尝试继续。
提示本身是因为我-M
在master的命令行上指定了两次而引起的。去引用SSH(1)
:
多个 -M 选项将 ssh 置于“主”模式,并在接受从属连接之前需要确认。