繁体   English   中英

在脚本中需要 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 }

解决问题的更通用方法是在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM