问题描述
最近在使用sftp过程中遇到的问题,使用sftp连接目标服务器的时候出现的报错信息,报错信息如下:

该问题通常是由于在目标服务器中~/.bashrc中存在输出信息,可以检查sftp时候使用的用户对应的位置是否存在输出信息。在网上搜索了不少相关资料现在整理一下。
原因分析
该错误是由远程系统(SFTP服务器)上的默认shell启动(或初始化)文件,如.bashrc、.bash_profile、/etc/profile或.shrc引起的,如果这些文件尝试将文本写入终端,就会引发错误。SSH会话具有由系统或者每个shell启动文件的程序传输信息,干扰了正常的SFTP或SCP协议。
我遇到的情况是有人在服务器端为了个性化输出一些内容,比如我想在服务器端每次用ssh登陆时看到“欢迎登陆”之类的消息,修改了~/.bashrc文件,导致客户端sftp连接失败。
解决方法
在网上搜索了几种解决方案,整理如下:
将~/.bashrc中的输出语句删除或者注释;
该方法比较暴力,影响个性化输出,解决的不够完美。
修改/etc/ssh/sshd_config中的配置信息:
vim /etc/ssh/sshd_config
#将下面的字段
Subsystem sftp /usr/libexec/openssh/sftp-server
#修改为
Subsystem sftp internal-sftp
该方法可以解决问题,但是很多人会疑惑sftp-server和internal-sftp的区别,内容主要聚焦于解决问题,就不在此过多解释了,感兴趣的可以直接互联网搜下,相关的解释很多,就不贴这里了。
在~/.bashrc中最上方添加代码:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
该脚本主要用于判断当前执行的是否是交互式shell,如果不是的话什么都不要做直接返回。
注:代码逻辑不唯一,只要实现该功能即可。
只有第三种信息符合我的需求,想在不修改~/.bashrc的输出内容的情况下解决。
希望文章对你们有帮助~
参考链接:
https://stackoverflow.com/questions/8250379/sftp-on-linux-server-gives-error-received-message-too-long
https://unix.stackexchange.com/questions/61580/sftp-gives-an-error-received-message-too-long-and-what-is-the-reason
https://www.ittsystems.com/troubleshooting-received-message-too-long/