【问题标题】:Expect script does not go the next command influx dropexpect script 不走下一个命令 influx drop
【发布时间】:2023-02-20 20:28:06
【问题描述】:

有这个 expect 脚本尝试使用 influxdb 自动执行某些任务。

#!/usr/bin/expect -f
spawn influx -username admin -password "XXXX"
expect ">"
send -- "use \"vivienda1-tmp-db\"\r"
expect ">"
send -- "show databases\r"
expect ">"
send -- "DROP database \"vivienda1-tmp-db\"\r"
expect ">"
send -- "DROP database \"vivienda2-tmp-db\"\r"
expect ">"
send -- "exit\r"

似乎某些东西正在异步运行并且对预期符号 (>) 的响应不佳。 influx 中的每个命令都应该返回该符号,但从下面的 debuf 信息来看似乎没有。它删除第一个数据库,但保留最后一个数据库不变。

expect -d 输出在这里。它似乎在 SHOW 的输出显示之前就发送了 DROP 命令。我不太熟悉 expect 脚本,但在我看来它是异步执行命令的。是吗?

spawn influx -username admin -password "XXXX"
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {11870}

expect: does "" (spawn_id exp4) match glob pattern ">"? no
Connected to http://localhost:8086 version 1.6.4
InfluxDB shell version: 1.6.4

expect: does "Connected to http://localhost:8086 version 1.6.4\r\nInfluxDB shell version: 1.6.4\r\n" (spawn_id exp4) match glob pattern ">"? no
>
expect: does "Connected to http://localhost:8086 version 1.6.4\r\nInfluxDB shell version: 1.6.4\r\n> " (spawn_id exp4) match glob pattern ">"? yes
expect: set expect_out(0,string) ">"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "Connected to http://localhost:8086 version 1.6.4\r\nInfluxDB shell version: 1.6.4\r\n>"
send: sending "use "vivienda1-tmp-db"\r" to { exp4 }

expect: does " " (spawn_id exp4) match glob pattern ">"? no
> use "vivienda1-tmp-db"

expect: does " \u001b[1G\u001b[0K> use "vivienda1-tmp-db"\u001b[25G\r\n" (spawn_id exp4) match glob pattern ">"? yes
expect: set expect_out(0,string) ">"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " \u001b[1G\u001b[0K>"
send: sending "show databases\r" to { exp4 }

expect: does " use "vivienda1-tmp-db"\u001b[25G\r\n" (spawn_id exp4) match glob pattern ">"? no
Using database vivienda1-tmp-db
> show databases

expect: does " use "vivienda1-tmp-db"\u001b[25G\r\nUsing database vivienda1-tmp-db\r\n> \u001b[1G\u001b[0K> show databases\u001b[17G\r\n" (spawn_id exp4) match glob pattern ">"? yes
expect: set expect_out(0,string) ">"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " use "vivienda1-tmp-db"\u001b[25G\r\nUsing database vivienda1-tmp-db\r\n>"
send: sending "DROP database "vivienda1-tmp-db"\r" to { exp4 }

expect: does " \u001b[1G\u001b[0K> show databases\u001b[17G\r\n" (spawn_id exp4) match glob pattern ">"? yes
expect: set expect_out(0,string) ">"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " \u001b[1G\u001b[0K>"
send: sending "DROP database "vivienda2-tmp-db"\r" to { exp4 }

expect: does " show databases\u001b[17G\r\n" (spawn_id exp4) match glob pattern ">"? no
name: databases
name
----
_internal
vivienda1

expect: does " show databases\u001b[17G\r\nname: databases\r\nname\r\n----\r\n_internal\r\nvivienda1\r\n" (spawn_id exp4) match glob pattern ">"? no
vivienda2
vivienda3
vivienda2-tmp-db
vivienda1-tmp-db

expect: does " show databases\u001b[17G\r\nname: databases\r\nname\r\n----\r\n_internal\r\nvivienda1\r\nvivienda2\r\nvivienda3\r\nvivienda2-tmp-db\r\nvivienda1-tmp-db\r\n" (spawn_id exp4) match glob pattern ">"? no
> DROP database "vivienda1-tmp-db"

expect: does " show databases\u001b[17G\r\nname: databases\r\nname\r\n----\r\n_internal\r\nvivienda1\r\nvivienda2\r\nvivienda3\r\nvivienda2-tmp-db\r\nvivienda1-tmp-db\r\n> \u001b[1G\u001b[0K> DROP database "vivienda1-tmp-db"\u001b[35G\r\n" (spawn_id exp4) match glob pattern ">"? yes
expect: set expect_out(0,string) ">"
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) " show databases\u001b[17G\r\nname: databases\r\nname\r\n----\r\n_internal\r\nvivienda1\r\nvivienda2\r\nvivienda3\r\nvivienda2-tmp-db\r\nvivienda1-tmp-db\r\n>"
send: sending "exit\r" to { exp4 }```

What is going on here?

【问题讨论】:

    标签: bash shell expect


    【解决方案1】:

    看起来 influxdb 输出下一个提示最后一个命令的输出,这会使您的脚本感到困惑。也许您可以通过查找前一个命令的部分输出而不是提示来解决这个问题。就像是:

    #!/usr/bin/expect -f
    spawn influx -username admin -password "XXXX"
    expect ">"
    send -- "use "vivienda1-tmp-db"
    "
    expect "Using database"
    send -- "show databases
    "
    expect "databases*----"
    send -- "DROP database "vivienda1-tmp-db"
    "
    expect "DROP database"
    send -- "DROP database "vivienda2-tmp-db"
    "
    expect "DROP database"
    send -- "exit
    "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多