我想以编程方式回答密码提示仅有的出现提示时执行 shell 脚本。是否可以通过这种方式自动执行此任务?我想完全避免其他工具 - 所以没有expect
或类似 - 我想简单地使用 shell 脚本来实现这一点。
答案1
由于您没有指定哪个贝壳,我就作弊吧。您可以找到以下内容以及更多其他信息grml.org的zsh爱好者的命令参考man
页。
$ zmodload zsh/zpty
$ zpty PW passwd $1
$ zpty PW passwd $1
# ``-r'': read the output of the command name.
# ``z'' : Parameter
$ zpty -r PW z '*password:'
# send the to command name the given strings as input
$ zpty -w PW $2
$ zpty -r PW z '*password:'
$ zpty -w PW $2
# The second form, with the -d option, is used to delete commands
# previously started, by supplying a list of their names. If no names
# are given, all commands are deleted. Deleting a command causes the HUP
# signal to be sent to the corresponding process.
$ zpty -d PW
我什至自己也做到了。这是我终端的复制+粘贴:
mikeserv@localhost ~ % :
sudo zsh -c '
zmodload zsh/zpty
userdel dummy
useradd -m dummy
zpty dummyadd "passwd dummy"
zpty -r dummyadd nl "*UNIX password:"
zpty -w dummyadd "dummypw^M"
zpty -r dummyadd nl "*UNIX password:"
zpty -w dummyadd "dummypw^M"
zpty -r dummyadd nl "*"
printf %s\\n "$nl"
zpty -d dummyadd
'
userdel: user 'dummy' does not exist
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
mikeserv@localhost ~ % ssh dummy@localhost
dummy@localhost's password:
dummy@localhost ~ %
我尝试了几次 - 这就是原因假的的主目录已经在那里 - 但您可以看到,当我运行该命令时,该用户不存在,并且我编写了一个会话来进行设置假的的密码。这是相当笨拙的脚本,但是,当它结束时,我能够登录假的。
所以我想这是可能的。也许不会可取的,但这也许取决于你的目的。