Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中更改用户_Python_Linux_Hadoop_Os.system - Fatal编程技术网

在python中更改用户

在python中更改用户,python,linux,hadoop,os.system,Python,Linux,Hadoop,Os.system,我正在编写一个简单的脚本,重新启动hadoop从机。在脚本中,我必须作为root用户进行一些初始更改。之后,我必须切换到用户“hadoop”并执行一组命令。我使用os.system运行命令,但我怀疑它是否运行良好。例如: uid=pwd.getpwnam('hadoop')[2] os.setuid(uid) os.system('whoami') os.chdir('/home/hadoop/hadoop/') os.system('bin/hadoop-daemon.sh stop task

我正在编写一个简单的脚本,重新启动hadoop从机。在脚本中,我必须作为root用户进行一些初始更改。之后,我必须切换到用户“hadoop”并执行一组命令。我使用os.system运行命令,但我怀疑它是否运行良好。例如:

uid=pwd.getpwnam('hadoop')[2]
os.setuid(uid)
os.system('whoami')
os.chdir('/home/hadoop/hadoop/')
os.system('bin/hadoop-daemon.sh stop tasktracker')
在此之后,我必须再次以root用户身份执行一些命令,并再次成为用户“hadoop”并执行:

os.system('bin/hadoop-daemon.sh stop tasktracker')
我这里有三个问题

  • system是我可以用来发布linux命令的最佳命令吗

  • 我可以通过上面的命令从root用户更改为root用户hadoop,但我不能更改为root用户(我可以理解,如果他们允许,会有安全问题,我想知道是否有可能这样做,至少通过传递密码)

  • os.setuid()工作吗?whoami打印用户hadoop,但是进程“tasktracker”并没有使用这些命令停止,但是如果我手动执行相同的命令,它就可以正常工作(我在手动尝试时使用“su hadoop”而不是setuid)

  • 谢谢你的帮助

    • 塞图

    我自己还没有做过,但我看到一些操作系统功能可能适用。他们从这里开始:

    此外,导师名单上还有一个主题:

    os.system方法是有限的,因为它只返回一个错误代码。该工具集更加灵活。

    您可以使用:

    os.system('sudo -u hadoop bin/hadoop-daemon.sh stop tasktracker')
    
    或者如果你没有sudo,但是有su

    os.system('su hadoop -c "bin/hadoop-daemon.sh stop tasktracker"')
    

    使用fabric library可以更干净地实现此类脚本: 此外,它还提供了漂亮的命令行界面和通过ssh管理远程服务器的功能。所有python都是可用的,因此您可以连接到数据库或导入任何需要的内容


    与其他用户一样运行命令的问题可以通过sudo命令和user arg实现:

    使用“su”比使用os.setuid()切换用户ID要好得多

    为什么?

    • “su”将正确设置登录凭据,包括组ID和补充组
    • “su”还可以做其他有用的事情,比如设置环境变量(特别是如果使用su-)。也许它还会根据limits.conf设置ulimit限制

    Mike,我必须以hadoop用户的身份运行这些命令,但我还必须以root用户的身份运行其他命令。但实际上,在使用sudo时,系统会提示我们输入密码,对吗?如果root用户运行python脚本,则所有命令都应作为root用户执行,“sudo-u hadoop…”将以指定用户的身份运行命令,并且由于您以root用户的身份运行该命令,因此不应有密码提示。对于如何使用subprocess执行此操作,看见