我正在尝试从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
系统提示我输入密码。为什么会这样?
答案 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)手册页。