sftp 报 Received message too long Ensure the remote shell produces no output for non-interactive sessions.
Win10控制台 sftp [email protected]
连接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 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-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
- Debian11.05 是
Subsystem sftp /usr/lib/openssh/sftp-server
- Ubuntu20.04 是
修改为 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会)