期望使用 SJWS wadm 命令

Expect with SJWS wadm command

我正在以非常传统的匹配字符串方式使用 expect,在环绕 iplanet/SJWS wadm 命令的 bash 脚本中发送所需的输入,它本身就是一个 bash 脚本调用 java 程序。

而不是当我手动 运行 程序时,某些组件(例如密码)会回显到 shell 并且似乎不会发送控制字符。

我认为这可能是多行正则表达式问题,但在 expect 前面使用通配符似乎不起作用,并且使用调试选项(发送密码字符串时)有 expect 比较密码与我想要匹配的字符串。

我对 expect 没有太多经验,希望之前是否有人见过这个问题。

谢谢

假设:

  • 您使用的是Unix环境;
  • 你没问题运行使用 expect 文件,而不是 expect 一行代码;
  • 您 运行 来自 wadm 脚本所在路径的以下脚本;

这可能会满足您的需求:

reset.exp

#!/usr/bin/expect

if {$argc != 1} {
    puts "Usage: expect $argv0 password"
    exit 1
}
set PASSWD [lindex $argv 0] ;# get password from the first argument

spawn -noecho $env(SHELL) ;# spawn a new process, in order to use send/expect
set timeout 10     ;# short one (10 s)
log_user 0         ;# disable showing up sensitive info (PASSWD value)

set cmd "wadm reset-admin-password" ;# put the command string into a variable
send "$cmd\r"
expect {
    -regex "enter admin-password.*$" {
        puts "Got the password request ..."
    }
    timeout {
        puts "ERROR: Timeout reached during running $cmd !"
        exit 1
    }
}
send "$PASSWD\r"
expect {
    -regex "enter admin-password again.*$" {
        send "$PASSWD\r"
        expect -re ".*$"
        # TODO: define reject/accept patterns
        puts "Password accepted!"
    }
    timeout {
        puts "ERROR: Timeout reached on entering password!"
        exit 1
    }
}
send "exit\r"
expect eof

并设法解决了问题,wadm 命令似乎建立了一个 soap 连接,这会减慢速度,所以

/usr/bin/expect << EOD
set password $PASSWD
spawn $BINDIR/wadm reset-admin-password
sleep 1
expect -re ".*admin-password> " {send -- "$password\r"}
expect -re ".*admin-password again> " {send -- "$password\r"}
expect -re ".*CLI" {send -- "exit\r"}
interact
EOD

感谢您的帮助!