python - Paramiko 在 psql 上执行命令
问题描述
使用 Paramiko 我正在创建一个连接到我的远程机器的 ssh,然后我调用 exec_command 来运行以下命令:
psql usera
通常exec_command
返回 , 和 的stdin
元stdout
组stderr
。因此,我在最后使用stdin
to write CREATE DATABASE X
with'\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)
推荐阅读
- github - 如何获取特定拉取请求 Github v3 的 pull_number?
- reactjs - 为什么我的程序化媒体查询不起作用(React.js)
- javascript - LocalStorage 不断带回已删除的值
- c++ - 使用 C/C++ 宏生成函数签名
- sql - 在多个条件下获取最小值
- c# - 正则表达式如何仅删除 @ 和 . 在 C# 中?
- r - 为字符串变量修复了获取变量长度不同的错误
- c# - c#和Unity,更新已更改为CSV文件的记录
- javascript - ReactDOM.unmountComponentAtNode 的性能
- mongodb - Google Compute Engine 上的 Bitnami MongoDB 副本集