我需要编写一个脚本,该脚本能够通过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:]方法。