![Sftp“子系统请求在通道 0 上失败”错误](https://linux22.com/image/1188819/Sftp%E2%80%9C%E5%AD%90%E7%B3%BB%E7%BB%9F%E8%AF%B7%E6%B1%82%E5%9C%A8%E9%80%9A%E9%81%93%200%20%E4%B8%8A%E5%A4%B1%E8%B4%A5%E2%80%9D%E9%94%99%E8%AF%AF.png)
我正在尝试使用名为“ssh2”的 Nodejs 库将文件从运行 Ubuntu 20.04.3 的远程服务器(服务器 1)传输到另一台远程服务器(服务器 2)。我的节点应用程序中出现有关“无法启动子系统 sftp”的错误,因此我尝试直接从服务器 1 上的命令行调用 sftp:
sftp -b /path/to/local/file -i /my/rsa_file [email protected]:/path/to/ship/file -v
并得到:
subsystem request failed on channel 0
Connection closed
我根本不是服务器管理员,但我猜 Ubuntu 默认没有配置传出 sftp。我该如何配置才能让它正常工作?我还想在本地机器 (macbook) 上运行在服务器 1 上运行的生产代码,所以我也想让它在那里工作。
迄今为止的故障排除步骤:
- 尝试从服务器 1 到服务器 2 进行 ssh 连接,一切正常
- 在服务器 1 上,检查 /etc/ssh/sshd_config 并发现以下行:
Subsystem sftp /usr/lib/openssh/sftp-server
- 然后检查 /usr/lib/openssh/sftp-server 并且文件存在
- 就是这样。我迷路了。
答案1
首先检查子系统 sftp 设置的行/etc/ssh/sshd_config
:
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
然后检查上面提到的可执行文件是否存在。对我来说,它位于:/usr/libexec/openssh/sftp-server
如果不存在,请尝试从包管理器重新安装 sftp-server,或找到适当的可执行文件(使用which
和whereis
)并将其复制到那里,或者只需将配置文件更改为正确的位置。最后确保它具有正确的权限:
-rwxr-xr-x 1 root root 63K Aug 27 12:07 /usr/libexec/openssh/sftp-server
不要忘记sudo systemctl restart ssh
在 systemd 发行版或sudo service ssh restart
其他地方重新启动 ssh 服务。