从python脚本中进行SSH并运行必须提供sudo密码的sudo命令

时间:2019-01-04 22:53:56

标签: python linux ssh sudo visudo

我正在尝试从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密码,因为我已在visudo末尾的新主机中添加了此命令(即,上面的internal_cmd)试图进入。但是,仍然需要像这样直接在终端中直接输入以下命令:

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

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

2 个答案:

答案 0 :(得分:0)

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

echo 'password' | sudo -S [command]

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

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

答案 1 :(得分:0)

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

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

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