在脚本中需要 sudo 时使用 expect 来输入密码

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 }

你引用的太多了。选择其中一项:

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

显然第一个选项更好。

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

一种更通用的解决问题的方法是匹配 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:\r"