作为芹菜任务的一部分,我正在运行下面的代码
class HealthCheckIKEV2:
async def report(self):
try:
client = RedisClient()
proc1 = subprocess.Popen(
["sudo", "/usr/sbin/swanctl", "--list-sas"], stdout=subprocess.PIPE
)
proc2 = subprocess.Popen(
["grep", "INSTALLED"],
stdin=proc1.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
proc3 = subprocess.Popen(
["wc", "-l"],
stdin=proc2.stdout,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
)
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits.
proc2.stdout.close() # Allow proc2 to receive a SIGPIPE if proc3 exits.
out, err = proc3.communicate()
info = {
"users": out.rstrip(),
"timestamp": datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S"),
}
client.conn.hset(settings.REDIS_VPN_SUBDOMAIN, mapping=info)
但是芹菜失败,并显示以下错误消息:
Jun 13 08:46:42 de-vpn-1 sudo[2038]: celery : user NOT in sudoers ; TTY=unknown ; PWD=/home/admin/app ; USER=root ; COMMAND=/usr/sbin/swanctl --list-sas
Jun 13 08:47:42 de-vpn-1 sudo[2045]: pam_unix(sudo:auth): conversation failed
这是因为在这一行中,子流程必须作为sudo运行才能执行/usr/sbin/swanctl
proc1 = subprocess.Popen(
["sudo", "/usr/sbin/swanctl", "--list-sas"], stdout=subprocess.PIPE
)
我的选择是什么?芹菜文档说不要给芹菜用户root访问权。我能做些什么来坚持最佳实践并成功执行此任务
我的一个想法是创建一个新组,并向该组添加root
和celery
用户。并将该文件的权限更改为该组。不过听起来有点老套。谢谢
我将把
celery
用户添加到sudoers
文件中,只允许使用所需的命令。使用visudo
并添加这些行NOPASSWD:
指令确保linux不会要求密码注意:这为任何可以控制此用户的人提供了此级别的访问权限
我只需在
/usr/sbin/swanctl
上设置setuid标志,然后从芹菜中运行它,而不需要sudo相关问题 更多 >
编程相关推荐