【问题标题】:SSHing from within a python script and run a sudo command having to give sudo password从 python 脚本中 SSH 并运行必须提供 sudo 密码的 sudo 命令
【发布时间】:2023-03-26 17:40:01
【问题描述】:

我正在尝试从 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 进入。但是仍然像这样直接在终端中输入此命令时:

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

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

【问题讨论】:

  • 尝试引用命令并传递完整路径ssh -t hostname "sudo -u username /path/to/internal_cmd -m POST -u/-/1234/2019-01-03" ...另外,sudoers 行是什么样的?
  • 如何在 python 中使用 ssh -t?执行 ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 使脚本永远运行
  • 也引用它不起作用。 sudoers 是这样的:用户名 ALL=NOPASSWD: internal_cmd
  • 您的 sudoers 条目不允许输入除单个 - 以外的参数,因此它与您传入的内容不匹配,因此会提示输入密码。
  • 那我需要做什么?

标签: python linux ssh sudo visudo


【解决方案1】:

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

echo 'password' | sudo -S [command]

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

警告:您可能已经知道这一点...但永远不要将密码直接存储在您的代码中,尤其是当您计划将代码推送到 Github 之类的东西时。如果您不知道这一点,请考虑使用环境变量或将密码存储在单独的文件中。

【讨论】:

  • 执行此操作:echo 'password' | ssh -tt 主机名 sudo -u username internal_cm -m POST -u jobRun/-/1234/2019-01-03 但是有没有办法让我不必以这种方式提供密码?我在visudo中添加了这个命令,为什么还需要密码?
【解决方案2】:

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

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

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

【讨论】:

  • 他已经有了,看问题;这对他不起作用。查看 cmets ;)
  • 知道了。由于某种原因,我没有在我常用的浏览器中看到 cmets。一个不同的浏览器做到了这一点。谢谢!
  • 广告拦截器隐藏了 cmets。叹息
猜你喜欢
  • 2021-07-19
  • 2014-09-13
  • 2021-03-30
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多