gpt4 book ai didi

python - Paramiko 在 psql 上执行命令

转载 作者:行者123 更新时间:2023-12-01 08:35:34 28 4
gpt4 key购买 nike

我正在使用 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()。这是启动命令以及在提示符下启动命令的正确方法吗?

最佳答案

您尝试在发送 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)

关于python - Paramiko 在 psql 上执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738792/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com