我想自动化 slappasswd,但以下不起作用:
[root@controller ~]# echo -e "vagrant\nvagrant\n" | slappasswd
New password:
虽然它可以自动化 passwd:
[root@controller ~]# echo -e "vagrant\nvagrant\n" | passwd vagrant
Changing password for user vagrant.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: passwd: all authentication tokens updated successfully.
问题
- 为什么此方法不能自动执行 slappasswd?
- 如何自动化 slappasswd?
答案1
根据这个联机帮助页您可以提供密码作为参数:
slappasswd -s vagrant
否则 slappasswd 将从 tty 而不是 stdin 读取来获取新密码。在这种情况下,您可以使用类似于expect
与它交谈的东西。
答案2
(替代我的答案)。需要在 /dev/tty 上进行用户交互而不仅仅是读取 stdin 的程序可以使用预计命令,使用tcl语言。例如,假设您在 /usr/bin/expect 中有 Expect,请创建一个setuserpw
包含以下内容的文件:
#!/usr/bin/expect -f
expect_user -re "(\[^ \]+) (\[^ \]+)\n"
set user $expect_out(1,string)
set pw $expect_out(2,string)
spawn passwd $user
expect "password:"
send "$pw\r"
expect "password:"
send "$pw\r"
expect eof
并且不要忘记使其可执行
chmod +x ./setuserpw
该脚本读取一行中两个单词的标准输入,并为它们设置变量user
和。然后它为用户pw
运行(生成)程序,通过伪 tty 连接(请参阅 参考资料)。它读取其输出以查找匹配“password:”的提示。然后,它将密码发送给程序,并再次执行相同的操作(假设程序要求您输入密码两次)。例如:passwd
man pty
./setuserpw <<!
user1 passwd1
!
在您的情况下,替换passwd
为slappasswd
,并验证您收到的提示是否与本示例中的提示相对应。