自动化 slappasswd

自动化 slappasswd

我想自动化 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.

问题

  1. 为什么此方法不能自动执行 slappasswd?
  2. 如何自动化 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:”的提示。然后,它将密码发送给程序,并再次执行相同的操作(假设程序要求您输入密码两次)。例如:passwdman pty

./setuserpw <<!
user1 passwd1
!

在您的情况下,替换passwdslappasswd,并验证您收到的提示是否与本示例中的提示相对应。

相关内容