
[英]Use knife solo with a non-root user with sudo access, without a password
[英]use expect to enter password when need sudo in script
我正在使用 Ubuntu 14.04 并安装了expect。 我正在尝试编写一个脚本来在提示时输入密码。
更新代码:
#!/usr/bin/expect -d
set timeout 20
set pw odroid
spawn sudo apt-get update
expect {\[sudo]\ password for odroid: }
send "$pw\r"
close
有什么建议吗? 谢谢
更新错误:
expect: does "" (spawn_id exp4) match glob pattern "\[sudo]\ password for odroid: "? no
[sudo] password for odroid:
expect: does "[sudo] password for odroid: " (spawn_id exp4) match glob pattern "\[sudo]\ password for odroid: "? yes
expect: set expect_out(0,string) "[sudo] password for odroid: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "[sudo] password for odroid: "
send: sending "odroid\r" to { exp4 }
解决问题的更通用方法是在assword上进行匹配
expect "*?assword*"
这允许使用更通用的脚本,其中用户名无关紧要。
下面的代码段也存在以下问题。 基本上$pw由 shell 解释,需要在期望的 TCL 代码之外设置。
pw="Password1234"
expect -f - <<-EOF
set timeout 10
spawn sudo -k
spawn sudo mysql_secure_installation
expect "*?assword*"
send -- "$pw\r"
expect eof
EOF
你的报价太多了。 选择以下之一:
expect {\[sudo\] password for odroid: }
expect "\\\[sudo\\\] password for odroid: "
显然第一个选项更好。
大量的转义是必要的,因为 1) 方括号在 glob 模式中是特殊的,2) 方括号是双引号中的特殊 Tcl 语法(命令替换),而不是大括号中的。
尝试用这个替换,它应该可以正常工作。
expect "\\[sudo\\] password for odroid:\\r"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.