Pythonスクリプトの予想されるコマンドを介してリモートPostGreSQLサーバーで実行されたクエリ結果をキャプチャする

Pythonスクリプトの予想されるコマンドを介してリモートPostGreSQLサーバーで実行されたクエリ結果をキャプチャする

握りたいポストグレースリモートサーバーで実行されたクエリ結果(パスワードなし - ssh)予想される特定のPostGresユーザーにパスワードを提供するために使用されるコマンド。実際、私たちのアプリケーションには2つのバージョンがあります。以前のバージョンには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;

ベストアンサー1

おすすめ記事