从pexpect子进程解析mysql-cli结果

时间:2019-09-04 10:38:23

标签: python mysql python-3.x ssh pexpect

我需要编写一个脚本,该脚本能够通过ssh登录到远程主机。使用mysql CLI运行MySQL查询,然后解析返回的行。

我需要这样做,因为该数据库仅在远程主机的本地主机上可用,而且我不知道如何在多跳上设置适当的ssh隧道以使用MySQL连接器连接到数据库。 / p>

我已经有一个工作代码可以连接到远程主机并运行mysql查询。

对于短查询和结果行(命令和查询<= 80个字符),我能够使用pxssh.prompt()child.before.splitlines()[1:]仅获取变量中的结果行。

但是使用更大的命令或结果行时,我将无法使用此方法 因为.before将包含触发的命令和/或多个终端行中的结果行。

也许有一个正则表达式,我可以期望它仅匹配结果行?我如何找到这样的正则表达式?

有人知道解析结果的更强大的方法吗?

我尝试将终端大小设置为更大,以确保回显的命令和结果行每个仅使用1个终端行。这样我就可以使用.before.splitlines()[1:0]方法。

可悲的是,这给了我一个错误:

File "network.py", line 74, in connect_by_ssh
    connection_child.setwinsize(25, 200)
File "/home/sassan/.local/lib/python3.6/site-packages/pexpect/pty_spawn.py", line 735, in setwinsize
    return self.ptyproc.setwinsize(rows, cols)
AttributeError: 'pxssh' object has no attribute 'ptyproc'

代码:

   def execute_command(self, con_child, command, timeout=TIMEOUT):      
        con_child.sendline(command)
        con_child.prompt()
        res = con_child.before
        return res.splitlines()[1:]

    def execute_sql_command(self, con_child, sql_queries, database_host, database_name, 
                            database_username, database_password, timeout):
        sql_command = Network.SqlAppKey + " -h " + database_host + " -u " + database_username + \
        " -p" + database_password + " -Be " + "\"use " + database_name + ";" + sql_queries + "\""

        return self.execute_command(con_child, sql_command, timeout)

例如命令:

mysql -h 127.0.0.1 -u root -pPASSWORD -Be "use DATABASE;select * from users where email = 'EMAIL'"

发送该命令后,回显的命令和结果行将分别跨越两行,这破坏了我的splitlines()[1:]方法。

0 个答案:

没有答案