使用期望在脚本中需要sudo时输入密码

时间:2016-07-19 12:04:50

标签: ubuntu-14.04 expect

我正在使用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

有什么建议吗? THX

更新错误:

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 }

3 个答案:

答案 0 :(得分:1)

你的报价太多了。选择以下之一:

expect {\[sudo\] password for odroid: }
expect "\\\[sudo\\\] password for odroid: "

显然,第一种选择更好。

大量的转义是必要的,因为1)方括号在glob模式中是特殊的,2)方括号是双引号中的特殊Tcl语法(命令替换),但不是花括号。

答案 1 :(得分:0)

解决问题的更通用的方法是匹配密码

expect "*?assword*"

这允许使用更通用的脚本,其中用户名不相关。

以下代码段也存在以下问题。基本上 $ pw 由外壳程序解释,需要在外部设置期望的TCL代码。

pw="Password1234"

expect -f - <<-EOF
  set timeout 10

  spawn sudo mysql_secure_installation
  expect "*?assword*"
  send -- "$pw\r"
  expect eof
EOF

答案 2 :(得分:0)

尝试用这个替换,它应该可以正常工作。

expect "\[sudo\] password for odroid:\r"