标签:任务 auth 建议 may border 执行 ali 安全策略 12px
实际开发系统的时候,经常需要用别的用户运行一个程序。比如,有些系统为保证系统安全,不允许使用root来运行。这里,我们总结了unix系统下如何解决这个问题的一些方法。同时,我们还讨论如何在python脚本里实现。
runuser允许使用替代用户和组ID来运行命令。如果选项-u没有给出,则回退到su兼容的语义和shell被执行。
用法:
runuser [options] -u <USER> COMMAND
runuser [options] [-] [USER [arg]...]
案例:
runuser -l elastic -c "ls /var/opt/elastic"
如果当前用户不是root:
runuser: may not be used by non-root users
su允许使用替代用户和组ID来运行命令。
案例:
$ su -l elastic
Password:*****
$ whoami
elastic
sudo允许允许的用户按照安全策略的规定,以超级用户或其他用户的身份执行命令。
案例:
sudo -u jim -g audio vi ~jim/sound.txt
命令 |
root到用户 |
用户到root |
任何用户间 |
身份验证 |
系统支持 |
日志 |
解释 |
---|---|---|---|---|---|---|---|
runuser |
Y |
N |
N |
不需要 |
Linux:是 Solaris:不 MacOS:是 |
N/A |
不用身份验证,效率较高 |
su |
Y |
Y |
Y |
目标用户的密码 |
Linux:是 Solaris:是 MacOS:是 |
/var/log/auth.log 或 /var/log/secure |
必须提供用户密码 |
sudo |
Y |
Y |
Y |
用户需要验证本人身份 |
Linux:是 Solaris:不 MacOS:是 |
/var/log/auth.log 或 /var/log/secure |
用户必须是wheel组的成员,可以执行管理员的工作 |
在实际工作中,越来越多需要用python来自动化任务、集成不同的部件、处理数据。很多时候会碰到同样问题:如何在python脚本中调用不同用户来运行程序。
subprocess.Popen将使用fork / exec模型来使用preexec_fn。这等同于按顺序调用
必须注意,由于os.setuid,os.setgid和preexec_fn仅在Unix上受支持,因此此解决方案仅支持unix及相关系统。
import os, pwd, subprocess, sys # set gid and uid def demote(user_uid, user_gid): def result(): os.setgid(user_gid) os.setuid(user_uid) return result # run a command under a new user def run_command(cmd, user_name, cwd): pw_record = pwd.getpwnam(user_name) user_name = pw_record.pw_name user_uid = pw_record.pw_uid user_gid = pw_record.pw_gid # get env variable env = os.environ.copy() env[ ‘HOME‘ ] = pw_record.pw_dir env[ ‘LOGNAME‘ ] = user_name env[ ‘PWD‘ ] = cwd env[ ‘USER‘ ] = user_name proc = subprocess.Popen(cmd, preexec_fn=demote(user_uid, user_gid), cwd=cwd, env=env ) return proc.communicate()
标签:任务 auth 建议 may border 执行 ali 安全策略 12px
原文地址:https://www.cnblogs.com/yshen4/p/8897690.html