Python 스크립트의 예상 명령을 통해 원격 PostGreSQL 서버에서 실행된 쿼리 결과 캡처

Python 스크립트의 예상 명령을 통해 원격 PostGreSQL 서버에서 실행된 쿼리 결과 캡처

나는 잡고 싶다포스트 그레이스원격 서버에서 실행된 쿼리 결과(비밀번호 없음 - ssh)예상되는특정 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에 비밀번호가 활성화되어 있으므로) 다음을 시도했지만 시간 초과가 발생했습니다.

방법 1:메시지가 표시되면 쿼리 실행

#! /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, db_user, db_name, db_pass, 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, _error, return_code = executeQuery(db_ip, db_user, db_name, db_pass, sql_query)

방법 2:다음을 사용하여 쿼리를 실행합니다. 포스트그레스-c 옵션 및 시간 초과 시나리오 처리

def executeQuery(db_ip, db_user, db_name, db_pass, 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, db_user, db_name, db_pass, sql_query)
    return execute(cmd)

다음 명령을 실행할 때예상되는원격 SSH 대신 psql이 설치된 서버에 직접 스크립트를 작성한 후 출력을 얻었습니다.

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;

관련 정보