나는 잡고 싶다포스트 그레이스원격 서버에서 실행된 쿼리 결과(비밀번호 없음 - 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;