0

我正在尝试从 python 脚本中通过 SSH 连接到另一台主机并运行需要 sudo 的命令。

我可以从 python 脚本 ssh 如下:

import subprocess
import sys
import json

HOST="hostname"
# Ports are handled in ~/.ssh/config since we use OpenSSH
COMMAND="sudo command"

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
    error = ssh.stderr.readlines()
    print(error)
else:
    print(result)

但我想在 sshing 之后运行这样的命令:

extract_response = subprocess.check_output(['sudo -u username internal_cmd',
                                          '-m', 'POST',
                                          '-u', 'jobRun/-/%s/%s' % (job_id, dataset_date)])

        return json.loads(extract_response.decode('utf-8'))[0]['id']

我怎么做?

另外,我不想在每次运行此 sudo 命令时都提供 sudo 密码,因为我已在尝试 ssh 的新主机中的 visudo 末尾添加了此命令(即上面的 internal_cmd)进入。但是仍然像这样直接在终端中键入此命令时:

ssh -t hostname sudo -u username internal_cmd -m POST -u/-/1234/2019-01-03

系统提示我提供密码。为什么会这样?

4

2 回答 2

0

您可以使用-S标志来管道密码,该标志告诉sudo您从标准输入中读取密码。

echo 'password' | sudo -S [command]

您可能需要尝试使用 ssh 命令的方式,但这应该可以满足您的需要。

警告:你可能已经知道了……但永远不要将密码直接存储在你的代码中,特别是如果你打算将代码推送到 Github 之类的东西上。如果您不知道这一点,请考虑使用环境变量或将密码存储在单独的文件中。

于 2019-01-04T23:03:21.617 回答
0

如果您不想担心 sudo 密码的存储位置,您可以考虑将脚本用户添加到 sudoers 列表中,并且 sudo 只能访问您要运行的命令以及不需要密码选项。请参见 sudoers(5) 手册页。

您可以通过在您的 authorized_keys 条目的开头添加“命令”选项来进一步限制命令访问。请参见 sshd(8) 手册页。

如果可以,请禁用 ssh 密码验证以仅需要 ssh 密钥验证。请参见 sshd_config(5) 手册页。

于 2019-01-05T00:10:16.940 回答