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 传文件
文章目录
sftp 报 Received message too long Ensure the remote shell produces no output for non-interactive sessions.解决办法1 : 移除 bashrc 中的输出语句移除 `echo`或`printf`输出语句 的脚本
解决办法2 : 修改 `/etc/ssh/sshd_config` 的 `Subsystem`
解决办法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;
tempPathFileStr="/etc/bashrc"
[ -f $tempPathFileStr.bak ] || cp -a $tempPathFileStr ${tempPathFileStr}.bak;
cat $tempPathFileStr | grep -E 'printf|echo' -v | tee "$tempPathFileStr" ; cat $tempPathFileStr ; unset tempPathFileStr;
grep 的小写 -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 sudo sed -Ee '/echo|printf/d' /bash/bashrc -i
sed 默认用基本正则, 加 -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 tempPathFileStr
tempPathFileStr="$HOME/.bashrc";
sudo awk ' $0 !~ /printf|echo/{ print > "'$tempPathFileStr'" }' $tempPathFileStr;
unset tempPathFileStr
tempPathFileStr="etc/bashrc";
sudo awk ' $0 !~ /printf|echo/{ print >"'"$tempPathFileStr"'"}' $tempPathFileStr;
unset tempPathFileStr
awk脚本引用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-serverCentOS7 是 Subsystem sftp /usr/libexec/openssh/sftp-serverCentOS9 是 Subsystem sftp /usr/libexec/openssh/sftp-serverRocky9 是 Subsystem sftp /usr/libexec/openssh/sftp-serverFedora36 是 Subsystem sftp /usr/libexec/openssh/sftp-server Ubuntu22.04 是 Subsystem sftp /usr/lib/openssh/sftp-server
Ubuntu20.04 是 Subsystem sftp /usr/lib/openssh/sftp-serverDebian11.05 是 Subsystem sftp /usr/lib/openssh/sftp-server
修改为 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 传文件了
(经测试,Ubuntu22.04Server版 不会出现这样的情况, 无需修改, 但 Debian11.05会)
好文链接
发表评论