改进期望脚本以登录白名单的postgres实例

问题描述

我正在将{"inline_keyboard":[[{"text":"Nightclub","callback_data":"{\"a\":(menu[i]),\"b\":(menu[i])}"}],[{"text":"Parks",\"b\":(menu[i])}"}]]} 用于简化的登录脚本,使其仅进入白名单(因此漏洞较少){"inline_keyboard":[[{"text":"Nightclub","callback_data":'{"a":"Nightclub","b":"Nightclub"}'}],"callback_data":'{"a":"Parks","b":"Parks"}'}]]} 实例。这是编辑过的脚本

expect

让我们运行它:

postgres

三个问题:

  • 假设最初进入#!/usr/bin/expect set RDSI [lindex $argv 0] spawn /usr/local/bin/psql -U postgres -h $RDSI -d clips expect "Password" send "myPassword\r" interact expect eof # I have tried with and without this line 的速度非常快(基本上是立即进入),随后20秒钟以上的延迟又是怎么回事?
  • 有什么办法可以抑制 myPassword 显示
  • 鉴于我们在打印19:00:38/ciderapp $./exp.sh spawn /usr/local/bin/psql -U postgres -h -d clips SET psql (12.4) Type "help" for help. clips=# # We get into the db v quickly # Delays here for about 20+ seconds myPassword # we don't necessarily want this printed! clips-# 之前已经已经连接了, (a)等待约20秒,然后(b)打印clips的行为令人困惑。可以解释吗?

解决方法

您看到的是expect的预期行为。您等待它接收密码提示或超时(默认为10秒),然后一旦它执行了这些操作之一,便无条件发送密码。如果要在提示不出现的情况下使用密码,则需要以接收密码提示为条件发送密码。

但是无论如何,将expectpsql一起使用毫无意义,因为PostgreSQL提供了比完成任务更好的方法。

,

您可以使expect命令有条件地执行操作。在这里,您需要输入密码提示,但不会出现。

假设交互式提示为"clips-#",则可以执行以下操作:

#!/usr/bin/expect
set RDSI [lindex $argv 0]
spawn /usr/local/bin/psql -U postgres -h $RDSI -d clips
set prompt "clips-#"
expect {
    "Password" 
        send "myPassword\r" 
        exp_continue
    }
    $prompt
}
interact 

该Expect语句中有2种模式。如果看到“密码”,它将发送密码,然后继续执行相同的Expect语句。看到提示时,由于没有任何操作,所以期望命令返回。

对于期望脚本的最后一行,使用

  • interact,如果您(人类)需要与产生的过程进行互动,或者
  • expect eof如果不需要交互,则只需等待该过程结束即可。