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等输出语句

导致 scpsftp 均不能使用

移除这句后, 问题解决

经测试,

  • 如果在 /etc/bashrc~/.bashrc 中有echo等输出语句, 则无法远程用scp, sftp 传文件
  • 如果在 /etc/profile~/.bash_profile 中有echo等输出语句, 不影响用scp, sftp 传文件

解决办法1 : 移除 bashrc 中的输出语句

移除 /etc/bashrc~/.bashrc 中的 echoprintf输出语句

sudo vi /etc/bashrc
sudo vi ~/.bashrc
移除 echoprintf输出语句 的脚本
  • grep 移除 echoprintf输出语句 , 带备份
    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 移除 echoprintf输出语句
    • $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 移除 echoprintf输出语句

    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变量

    1. -v选项, 定义awk变量=$Shell变量 , 引用时不加$
    2. 直接在awk脚本里用 (引号和变量之间不能有空格)
      双单引号紧接$Shell变量名紧接单双引号

      双单双引号紧接$Shell变量名紧接双单双引号




解决办法2 : 修改 /etc/ssh/sshd_configSubsystem
  1. 修改 /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
  • Ubuntu22.04 是 Subsystem sftp /usr/lib/openssh/sftp-server
    • Ubuntu20.04 是 Subsystem sftp /usr/lib/openssh/sftp-server
    • Debian11.05 是 Subsystem sftp /usr/lib/openssh/sftp-server

修改为 Subsystem sftp internal-sftp , 使用内部sftp

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
  1. 重启sshd服务
sudo systemctl restart sshd
或
sudo service sshd restart

修改后, 即便 /etc/bashrc~/.bashrc 文件中有echo,printf等输出语句 , 也可以使用 sftp,scp 传文件了

(经测试,Ubuntu22.04Server版 不会出现这样的情况, 无需修改, 但 Debian11.05会)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐