在 Debian 13系统中,/bin/sh 指向 Dash,而Dash 的 echo 命令不支持 -e 参数(POSIX 标准的 echo 也不要求支持 -e),这会导致:
- 执行 echo -e "密码\n密码" 时,Dash 会把 -e、\n 当作普通字符串输出,而非解析换行符;
- Pure-FTPd 收到的不是预期的 “两行密码”,而是乱码(如 -e 密码\n密码),因此触发 Error with entering password - aborting。
/www/server/panel/class/ftp.py中所有的echo -e 换成 printf
- //比如
- command = 'echo -e "{}\n{}\n" | {}/pure-pw useradd "{}" -u www -d {}'.format(password,password,self.__runPath,username,get["path"])
- 换成(加-m确保即时生效):
- command = 'printf "{}\\n{}\\n" | {}/pure-pw useradd "{}" -u www -d {} -m'.format(password,password,self.__runPath,username,get["path"])
复制代码
解决方法的另一种思路(系统级修改)
除了刚才教你的“修改代码”之外,其实还有一种粗暴的方法,就是把你的系统也改成“宽容模式”,这样不需要改宝塔代码也能好用:
操作步骤:
在终端执行:
屏幕会出现一个弹窗,问你:Use dash as the default system shell (/bin/sh)?
选择 <No> (也就是否)。
回车确认。
效果:
这样做之后,你的 /bin/sh 就会指向 bash。此时,echo -e 就可以正常工作了,宝塔原本的 FTP 添加功能也会瞬间恢复正常,因为 Bash 能听懂宝塔那句“方言”。
但为什么我刚才首推改代码?
因为改系统 Shell 可能会影响系统启动速度(Bash 比 Dash 慢)以及其他依赖 Dash 特性的系统级脚本。修改宝塔代码为 printf 是最标准、兼容性最好的做法,无论系统 Shell 是什么,它都能稳如泰山。
|
|