在脚本中需要 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"
我正在使用 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"