Paramiko在psql上执行命令

时间:2018-12-12 08:21:45

标签: python shell ssh psql paramiko

使用Paramiko,我正在创建一个SSH来连接到我的远程计算机,然后调用exec_command来运行以下命令:

psql usera

通常exec_command返回stdinstdoutstderr的元组。因此,我使用stdin来写CREATE DATABASE X并以'\n'结尾,以模拟输入按钮。该命令会花费很多时间,看起来像是卡住了。

这是我的代码:

stdin, stdout, stderr = self.ssh.exec_command('psql usera')
print('executed')
print(stdin)
print(stdout)
print(stderr)
for err in stderr:
    print(err)
for std in stdout:
    print(std)
stdin.write('CREATE DATABASE ' + db_name + ';\n')

此代码将打印以下内容:

executed
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
<paramiko.ChannelFile from <paramiko.Channel 2 (open) window=2097152 -> <paramik
o.Transport at 0x36a29b0 (cipher aes128-ctr, 128 bits) (active; 3 open channel(s
))>>>
2018-12-12 19:22:39; DEBUG; EOF in transport thread

这意味着代码不会执行stdin.write()。这是启动命令并在提示符下启动命令的正确方法吗?

1 个答案:

答案 0 :(得分:1)

您尝试在发送SQL命令之前读取命令输出。您的循环等待命令完成,而它永远不会等待,因为它一直在等待输入。那是一个僵局。

必须相反:

stdin.write('CREATE DATABASE ' + db_name + ';\n')
for err in stderr:
    print(err)
for std in stdout:
    print(std)

虽然我对psql命令行不熟悉,但是我很确定上面的代码也会挂起,因为在CREATE DATABASEpsql之后,它可能会一直等待对于另一个命令。您需要添加类似EXIT的内容。或致电stdin.close()

stdin.write('CREATE DATABASE ' + db_name + ';\n')
stdin.close()
for err in stderr:
    print(err)
for std in stdout:
    print(std)