0

这是一个关于通过 SSH 在 python 交互模式下工作的命令的问题,但如果包含在脚本中则不会。它快把我逼疯了。我一直遇到脚本问题,但现在我发现我可以简单地将这些行放入 python shell 中,我得到了我期望的确切结果!这让我很困惑,我不知道如何继续,因为我需要它在脚本中工作。对于 python shell,我通过 SSH 登录,然后打开一个 python 脚本,而不是通过 python ssh 模块登录。从那里开始,它完全按预期工作。

import ssh
import gnupg
import pickle

s = ssh.Connection(host = 'ipaddress', username = 'toolserv', password = 'xxxx') 

gpg = gnupg.GPG(gnupghome="/home/toolserv/.gnupg") 

with open("result1.txt", "r") as my_file:
    signed_data1 = pickle.load(my_file)
    my_file.close()

print signed_data1

s.close()

如果我从 sudo 执行脚本,我从脚本中得到的错误是:

Traceback (most recent call last):
  File "sshx.py", line 11, in <module>
    with open("result1.txt", "r") as my_file:
IOError: [Errno 2] No such file or directory: 'result1.txt

ls -ld 给出以下结果: drwxr-xr-x 29 toolserv toolserv 4096 2012-08-19 22:38

4

1 回答 1

3

初步答案

您的脚本在您的本地主机上执行,而不是在您的目标服务器上。请注意您如何打开SSH会话然后不使用它。

toolserv此主机上可能不存在该用户。因此gnupg尝试创建目录时出现错误。

回应您的评论:

让我更清楚地说明这一点。仅仅调用s = ssh.Connection(host = 'ipaddress', username = 'toolserv', password = 'xxxx') 并不意味着所有后续代码都将在远程主机上执行。

现在,您的代码执行以下操作:

  1. ipaddress通过 SSH连接到远程主机
  2. 使用带有位于本地主机/home/toolserv/.gnupg上的密钥的 gnupg 库。
  3. 阅读本地主机上的一些(腌制?)文件内容。
  4. 打印(未腌制的)内容
  5. 关闭 SSH 连接(从不使用它)。

您从不使用 SSH 连接,这可能不是您想要的,也可能是您的脚本失败的原因。

当然,如果您通过 SSH 登录然后使用 shell 在远程主机上执行完全相同的脚本,那么您的本地主机实际上就是远程主机,所以它可以工作。但是,从远程主机执行代码时可以工作的事实只不过是一个巧合

最后一次,您的脚本可能没有按照您的想法执行,除非您对此进行调查,否则它永远不会起作用。

于 2012-08-20T11:31:48.247 回答