我在此使用bash脚本中的文档来自动安装和设置需要多次密码的地方。我输入一次密码,脚本将其传递给各个命令。在大多数情况下,这里文档方法处理这一点。但是,在一种情况下,我得到了这个错误:
Enter VNC password: stty: standard input: Inappropriate ioctl for device
Verify password:
stty: standard input: Inappropriate ioctl for device
请注意,此错误消息来自x11vnc -storepassword
(而不是sudo
)。
我的问题与x11vnc -storepasswd
有关,下面是我的代码:
sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC
显然(从错误中)不起作用。我希望有一个如何在脚本中实现sudo x11vnc -storepasswd ~/.vnc/passwd
的工作示例。
如果有帮助,提示如下:
输入VNC密码: 验证密码:写密码到/home/user/.vnc/passwd?是/n n
使用expect
会是一个更好的解决方案吗?如果是这样的话,我将如何在这种情况下使用它?(我以前从未使用过expect
,但自从发布这个问题以来,我已经看过很多例子,我无法让expect
自己工作。)
发布于 2013-07-11 22:59:23
x11vnc
期望它的标准输入是一个终端,它改变终端模式以避免在键入时回显密码。当标准输入不是终端时,stty
调用关闭并恢复回显失败,从而产生警告。
期望确实是一种解决办法。尝试这个脚本(未经测试):
#!/usr/bin/expect -f
spawn x11vnc -storepasswd ~/.vnc/passwd
expect "password:" {send "swordfish" "\r"}
expect "password:" {send "swordfish" "\r"}
expect "Write*\?" {send "y\r"}
或者,如果可以,可以使用RFB以外的身份验证方法(-passwdfile
,或SSL客户端证书)。
发布于 2014-02-03 19:18:56
避免这些警告消息的另一个选项是在由UNIX命令创建的伪终端中执行x11vnc
(参见使用伪终端(pty)控制交互程序)。这可以使用script
命令或诸如pdip
(“与交互程序的编程对话”)等工具来完成。
MacOSX10.6.8上未为x11vnc
提供伪终端的警告消息:
# x11vnc 0.9.14
sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC
# Enter VNC password: stty: stdin isn't a terminal
#
# Verify password:
# stty: stdin isn't a terminal
# Write password to ~/.vnc/passwd? [y]/n Password written to: ~/.vnc/passwd
使用script
命令的解决方案:
# GNU script command
sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' <<ENDDOC /dev/null
password
password
y
ENDDOC
# ... or ...
printf '%s\n' 'password' 'password' 'y' |
sudo script -q -c 'x11vnc -storepasswd ~/.vnc/passwd' /dev/null
# FreeBSD script command
sudo script -q /dev/null x11vnc -storepasswd ~/.vnc/passwd <<ENDDOC
password
password
y
ENDDOC
https://unix.stackexchange.com/questions/82658
复制相似问题