【发布时间】:2016-07-27 07:28:12
【问题描述】:
我正在尝试使用 expect 将 $PASSWORD 变量内容传递到 passwd。这似乎可以添加用户,但是一旦您尝试使用其中一个用户通过 ssh 登录,它就不起作用了。如果我手动设置密码,那就没问题了。
以前有人遇到过这个问题吗?
USERS=(user1 user2 user3)
generatePassword ()
{
pwgen 16 -N 1
}
# Check if user is root
if [ $(whoami) != 'root' ]; then
echo "Must be root to run $0"
exit 1;
fi
# Check if pwgen is installed:
if [[ $(dpkg -s pwgen > /dev/null 2>&1; echo ${PIPESTATUS} ) != '0' ]]; then
echo -e "pwgen is not installed, this script will not work without it\n\n'apt-get install pwgen'\n"
exit 1;
else
echo -e "Starting Script...\n\n"
fi
# Iterate through users and add them with a password
for i in ${USERS[@]}; do
PASSWORD=$(generatePassword)
echo "$i $PASSWORD" >> passwords
useradd -m "${i}"
echo -e "Adding $i with a password of '$PASSWORD'\n"
expect -c "
spawn passwd ${i}
expect \"Enter new UNIX password:\"
send -- \"$PASSWORD\r\"
send -- \"\r\"
expect \"Retype new UNIX password:\"
send -- \"$PASSWORD\r\"
send -- \"\r\"
"
echo -e "\nADDED $i with a password of '$PASSWORD'\n"
done
【问题讨论】:
-
Ewww。您正在对希望解析为代码的内容执行字符串替换?这是一种严重的代码异味——如果允许用户设置自己的密码,这可能会被用作任意命令注入漏洞。
-
顺便说一句,请参阅pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 以了解围绕环境变量名称(以及共享命名空间的 shell 变量的名称)的 POSIX 约定——全大写名称由对 shell 或有意义的变量使用操作系统,至少有一个小写字符的名称保留给应用程序使用;因此,请考虑
password而不是PASSWORD,以避免错误地覆盖对操作系统有意义的变量。 -
@CharlesDuffy - 我知道,这是一个小时无知摸索的结果!我正在努力变得更好
-
顺便说一句——考虑养成使用
printf而不是echo -e的习惯。请参阅echo的 POSIX 标准,特别是 APPLICATION USAGE 部分,pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html -- bash 通过实现 @987654329 实际上是 noncompliant (不仅扩展了标准,而且违反了黑字行为) @ 默认情况下,并且使用一些非默认 shell 选项(例如xpg_echo),该行为会消失(并且echo -e在输出上打印-e)。 -
谢谢!将用 printf 修改我的脚本