sftp 报 Received message too long Ensure the remote shell produces no output for non-interactive sessions.
Win10控制台 sftp root@192.168.168.115 连接Linux文件服务, 报👇
Received message too long 796028783 Ensure the remote shell produces no output for non-interactive sessions.
原因是:/etc/bashrc 或 ~/.bashrc 中有echo,printf等输出语句
导致 scp 和 sftp 均不能使用
移除这句后, 问题解决
经测试,
- 如果在
/etc/bashrc或~/.bashrc中有echo等输出语句, 则无法远程用scp,sftp传文件 - 如果在
/etc/profile或~/.bash_profile中有echo等输出语句, 不影响用scp,sftp传文件
解决办法1 : 移除 bashrc 中的输出语句
移除 /etc/bashrc 或 ~/.bashrc 中的 echo或printf输出语句
sudo vi /etc/bashrc
sudo vi ~/.bashrc
移除 echo或printf输出语句 的脚本
- 用
grep移除echo或printf输出语句 , 带备份tempPathFileStr="$HOME/.bashrc" [ -f $tempPathFileStr.bak ] || cp -a $tempPathFileStr ${tempPathFileStr}.bak; cat $tempPathFileStr | grep 'printf\|echo' -v | tee "$tempPathFileStr" ; cat $tempPathFileStr ; unset tempPathFileStr;grep 的小写tempPathFileStr="/etc/bashrc" [ -f $tempPathFileStr.bak ] || cp -a $tempPathFileStr ${tempPathFileStr}.bak; cat $tempPathFileStr | grep -E 'printf|echo' -v | tee "$tempPathFileStr" ; cat $tempPathFileStr ; unset tempPathFileStr;-v输出不匹配的行, grep默认用基本正则, 加-E使用扩展版正则(|不用写成\|)
- 用
sed移除echo或printf输出语句$HOME/.bashrc
sed '/echo\|printf/d' $HOME/.bashrc -i 或 sed -e '/echo\|printf/d' $HOME/.bashrc -i 或 , 默认是基本正则, 加 -E 是扩展正则, |前不用加\ , (-E 等效 -r 等效 --regexp-extended) -E是 POSIX 标准, (为保证可移植性使用 POSIX -E) sed -E '/echo|printf/d' $HOME/.bashrc -i 或 sed -E -e '/echo|printf/d' $HOME/.bashrc -i 或 sed -Ee '/echo|printf/d' $HOME/.bashrc -i/bash/bashrc
sed 默认用基本正则, 加sudo sed -Ee '/echo|printf/d' /bash/bashrc -i-E是扩展正则, |前不用加\ , (-E等效-r等效--regexp-extended)d是删除行,3d删除第三行 ,1,4d删除一到四行,/表达式/d删除匹配行
-
用
awk移除echo或printf输出语句tempPathFileStr="$HOME/.bashrc"; sudo awk -v oFile=$tempPathFileStr ' $0 !~ /printf|echo/{print>oFile}' $tempPathFileStr; unset tempPathFileStrtempPathFileStr="$HOME/.bashrc"; sudo awk ' $0 !~ /printf|echo/{ print > "'$tempPathFileStr'" }' $tempPathFileStr; unset tempPathFileStrtempPathFileStr="etc/bashrc"; sudo awk ' $0 !~ /printf|echo/{ print >"'"$tempPathFileStr"'"}' $tempPathFileStr; unset tempPathFileStrawk脚本引用shell变量
- 用
-v选项, 定义awk变量=$Shell变量, 引用时不加$ - 直接在awk脚本里用 (引号和变量之间不能有空格)
双单引号紧接$Shell变量名紧接单双引号或
双单双引号紧接$Shell变量名紧接双单双引号
- 用
解决办法2 : 修改 /etc/ssh/sshd_config 的 Subsystem
- 修改
/etc/ssh/sshd_config
sudo vi /etc/ssh/sshd_config
将 Subsystem sftp /usr/libexec/openssh/sftp-server
原版Subsystem:
- AlmaLinux9 是
Subsystem sftp /usr/libexec/openssh/sftp-server- CentOS6 是
Subsystem sftp /usr/libexec/openssh/sftp-server - CentOS7 是
Subsystem sftp /usr/libexec/openssh/sftp-server - CentOS9 是
Subsystem sftp /usr/libexec/openssh/sftp-server - Rocky9 是
Subsystem sftp /usr/libexec/openssh/sftp-server - Fedora36 是
Subsystem sftp /usr/libexec/openssh/sftp-server
- CentOS6 是
- Ubuntu22.04 是
Subsystem sftp /usr/lib/openssh/sftp-server- Ubuntu20.04 是
Subsystem sftp /usr/lib/openssh/sftp-server
- Ubuntu20.04 是
(经测试,Ubuntu22.04Server版 不会出现这样的情况, 无需修改)
修改为 Subsystem sftp internal-sftp , 使用内部sftp
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
- 重启sshd服务
sudo systemctl restart sshd
或
sudo service sshd restart
修改后, 即便 /etc/bashrc 或 ~/.bashrc 文件中有echo,printf等输出语句 , 也可以使用 sftp,scp 传文件了