如何在unix系统中用别的用户运行一个程序?

时间:2018-04-21 12:25:47   收藏:0   阅读:1227

1、问题的缘由

实际开发系统的时候,经常需要用别的用户运行一个程序。比如,有些系统为保证系统安全,不允许使用root来运行。这里,我们总结了unix系统下如何解决这个问题的一些方法。同时,我们还讨论如何在python脚本里实现。

2、unix系统的方法

2.1、runuser

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

2.2、su

su允许使用替代用户和组ID来运行命令。

案例:

$ su -l elastic
Password:*****

$ whoami
elastic

2.3、sudo

sudo允许允许的用户按照安全策略的规定,以超级用户或其他用户的身份执行命令。

案例:

sudo -u jim -g audio vi ~jim/sound.txt

2.4、总结

命令

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组的成员,可以执行管理员的工作

3、python脚本的方法

 在实际工作中,越来越多需要用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()

 

原文:https://www.cnblogs.com/yshen4/p/8897690.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!