通过python脚本中的expect命令捕获远程PostGreSQL服务器中执行的查询结果

问题描述

我想通过 expect 命令捕获在远程服务器 (passwordless-ssh) 中执行的 PostGres 查询结果,该命令用于提供给定的密码PostGres 用户。 实际上,我们的应用程序有两个版本,旧版本不需要 Postgres 密码,而新版本需要密码。所以测试用例必须处理这个

在旧版本(不需要 psql 密码)中,执行查询的 cmd 字符串非常简单:

cmd = 'ssh ' + db_ip + ' "psql -h localhost -p 5434 -U perfmon -d network -c \\\"select count(*) from crm_customer_device_info;\\\""'

但是对于新版本(因为psql启用了密码),我尝试了以下方法,但发生超时

方法一:出现提示时执行查询

#! /usr/bin/python

import subprocess

def execute(cmd):
    proc = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    _output,_error = proc.communicate()
    _code = proc.returncode
    return _output,_error,_code

def executeQuery(db_ip,db_user,db_name,db_pass,sql_query):
    cmd = '''/usr/bin/expect -c 'spawn -noecho ssh -q {0} "psql -h localhost -p 5434 -U {1} -d {2}"
           expect {{
             -nocase "Password*" {{
                send "{3}\r"
                exp_continue
             }}
             "=# " {{
                send "{4}"
                set var $expect_out(buffer);
                send "\q\n"
              }}
           }}
           '
       '''.format(db_ip,sql_query)
    return execute(cmd)

db_ip = "192.168.0.1"
db_user = "perfmon"
db_name = "network"
db_pass = "xxx"
sql_query = "select count(*) from crm_customer_device_info;"

_output,return_code = executeQuery(db_ip,sql_query)

方法 2:使用执行查询 postgres -c 选项和处理超时场景

def executeQuery(db_ip,sql_query):
    cmd = '''/usr/bin/expect -c 'spawn ssh {o} "psql -h localhost -p 5434 -U {1} -d {2} -c \\\'{4}\\\' "
           expect {{
             -nocase "Password*" {{
                send -- "{3}\r"
                exp_continue
             }}
             -nocase "permission denied" {{
               exit 4
             }}
             -nocase "timed out" {{
               exit 2
             }}
             timeout {{
               exit 1
             }}
           }}
           '
       '''.format(db_ip,sql_query)
    return execute(cmd)

当我直接在安装 psql 而不是远程 ssh 的服务器上执行以下 expect 脚本时,我设法获得输出

spawn -noecho psql -h localhost -p 5434 -U user -d db;
               expect {
                 "^Password*" {
                   send -- "passwd\r"
                   exp_continue
                }
                "*=# " {
                send -- "select Now();\r\n"
                set var $expect_out(buffer);

                send "\\q\r\n"
                exp_continue
               }
               }; #puts $var; #interact;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)