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会)

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。