参考 Received message too long Ensure the remote shell produces no output for non-interactive sessions.
现象
ssh连接正常,但sftp却无法连接。(sftp是ssh内含的协议)
使用命令行sftp root@101.35.xx.xx
连接时,返回了这个错误:Received message too long 1763729773 Ensure the remote shell produces no output for non-interactive sessions.
(收到的信息太长 1763729773 确保远程shell对非交互式会话不产生输出)
坑点在于使用Tabby(一个终端模拟器)连接sftp并不会报错,而是一直没反应。只有使用命令行连接时,才得知了这个错误,但平时很少人会尝试用命令行连接。
原因
原因是:~/.bashrc
或 ~/.bashrc
等Shell启动文件中存在echo
,printf
等输出语句,导致sftp不能建立连接。
(这两是bash的启动文件,如果你用的是zsh等其他Shell,需要找与你用的Shell对应的启动文件。)
(关于shell启动文件详见:【Linux基础】理解并善用Shell – Shell精讲)
————
根据这篇文章 Received message too long Ensure the remote shell produces no output for non-interactive sessions.
所说:经过实验:
- 如果在
/etc/bashrc
或~/.bashrc
中有echo等输出语句, 则无法远程用scp, sftp 传文件 - 如果在
/etc/profile
或~/.bash_profile
中有echo等输出语句, 不影响用scp, sftp 传文件
这里有一些小问题,/etc/profile
和~/.bash_profile
是交互式登录式shell加载的,/etc/bashrc
或 ~/.bashrc
是交互式非登录式Shell加载的。而命令行连接sftp报的错是... produces no output for non-interactive sessions
,说的是非交互式Shell。这里就有点矛盾,按说非交互式Shell不会加载Shell的启动文件,而sftp明显需要登录。
说这些仅做了解即可,具体就不深究了,这都是小问题。
解决方法
方法一: 移除Shell启动文件中的输出语句。
移除 ~/.bashrc
或 ~/.bashrc
等启动文件中的输出语句。
其实这些文件本身是没有输出语句的,所以基本上是使用者自己写的,具体写在哪些文件里应该会有印象。并且这些语句会在建立ssh连接的时候打印出来,真的不好找的话,可以在所有启动文件中搜索打印的内容,就能找到啦。
方法二: 修改sftp服务为内部的sftp。
编辑/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
找到Subsystem
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server
注释掉,并新增一行 Subsystem sftp internal-sftp
, 表示使用内部sftp
(修改后, 即便Shell启动文件中有输出语句,也不再影响sftp的使用)
然后重新连接ssh,或重启sshd服务即可