Paramiko 在 psql 上执行命令
Paramiko execute command on psql
我正在使用 Paramiko 创建一个连接到我的远程机器的 ssh,然后我调用 exec_command 到 运行 以下内容:
psql usera
通常 exec_command
returns stdin
、stdout
和 stderr
的元组。因此,我用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()
。这是启动命令和在提示符下启动命令的正确方法吗?
您在发送 SQL 命令之前尝试读取命令输出。你的循环等待命令完成,它永远不会做的事情,因为它一直在等待输入。那是一个僵局。
必须反过来:
stdin.write('CREATE DATABASE ' + db_name + ';\n')
for err in stderr:
print(err)
for std in stdout:
print(std)
虽然我不熟悉 psql
命令行,但我很确定上面的代码也会挂起,因为在 CREATE DATABASE
、psql
之后它可能会挂起继续等待另一个命令。您需要添加类似 EXIT
的内容。或致电 stdin.close()
.
stdin.write('CREATE DATABASE ' + db_name + ';\n')
stdin.close()
for err in stderr:
print(err)
for std in stdout:
print(std)
我正在使用 Paramiko 创建一个连接到我的远程机器的 ssh,然后我调用 exec_command 到 运行 以下内容:
psql usera
通常 exec_command
returns stdin
、stdout
和 stderr
的元组。因此,我用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()
。这是启动命令和在提示符下启动命令的正确方法吗?
您在发送 SQL 命令之前尝试读取命令输出。你的循环等待命令完成,它永远不会做的事情,因为它一直在等待输入。那是一个僵局。
必须反过来:
stdin.write('CREATE DATABASE ' + db_name + ';\n')
for err in stderr:
print(err)
for std in stdout:
print(std)
虽然我不熟悉 psql
命令行,但我很确定上面的代码也会挂起,因为在 CREATE DATABASE
、psql
之后它可能会挂起继续等待另一个命令。您需要添加类似 EXIT
的内容。或致电 stdin.close()
.
stdin.write('CREATE DATABASE ' + db_name + ';\n')
stdin.close()
for err in stderr:
print(err)
for std in stdout:
print(std)