【发布时间】:2017-03-13 14:19:24
【问题描述】:
我关注了这个question 我在 PostgreSQL 中有这个功能:
CREATE OR REPLACE FUNCTION a()
RETURNS void AS
$BODY$
import subprocess
cmd1 = "usr/bin/ssh usera@192.168.10.5 time"
out1, err1 = subprocess.Popen(cmd1,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
plpy.notice(out1)
$BODY$
LANGUAGE plpythonu VOLATILE
这应该登录到指定的服务器并显示其time。
无论我做什么,我总能得到:
错误:OSError:[Errno 2] 没有这样的文件或目录
我没有得到错误的唯一一次是如果 cmd1 = "usr/bin/ssh" 但它什么也没做。
我怎样才能让它工作?
【问题讨论】:
-
我认为
ssh命令的路径应该以根文件夹-/usr/bin/ssh开头。如果没有前导斜杠,它将是一个相对路径 - 也许这就是引发“没有这样的文件或目录”错误的原因。 -
cmd1应该更像:cmd1 = ['/usr/bin/ssh', 'usera@192.168.10.5', 'time']。这是(如果我没记错的话)因为Popen()假定命令参数是一个列表,除非危险地提供shell=True。你也可以使用cmd1 = shlex.split("/usr/bin/ssh usera@192.168.10.5 time")。 -
@Torxed 这可以防止错误但是没有任何东西打印到屏幕上
-
@avi 很可能是因为运行脚本的主机不允许在没有密码的情况下进行 SSH - 或者
plpy.notice()不是字符串?如果 SSH 挂起等待密码,.communicate()也将挂起并按照文档中的描述等待:Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. >>>Wait for process to terminate.<<<。您是否尝试过从服务器手动运行此命令一次,看看会发生什么?
标签: python postgresql ssh