在Python中更改用户

我正在写一个简单的脚本,重新启动一个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') 

我在这里有三个问题,

  1. os.system是我可以用来发行linux命令的最好命令吗?

  2. 我可以通过上面的命令从root用户更改为用户hadoop,但我无法更改为root用户(我可以理解,如果他们允许这样做会有安全问题,我想知道是否有任何可能做到这一点,至less通过传递密码)?

  3. os.setuid()是否工作? whoami打印用户hadoop但进程“tasktracker”不停止使用这些命令,但如果我手动执行相同的命令,它工作正常(手动尝试出来时,我使用“su hadoop”而不是setuid)。

感谢你的帮助。

  • Sethu

你可以使用:

 os.system('sudo -u hadoop bin/hadoop-daemon.sh stop tasktracker') 

或者如果你没有sudo,但有su

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

这种脚本可以通过使用结构库实现得更干净: http : //docs.fabfile.org/en/1.3.1/index.html另外,它提供了很好的命令行界面和通过ssh进行远程服务器管理的功能。 所有的Python都是可用的,所以你可以连接到数据库例如或导入任何你需要的。

关于像其他用户一样运行命令的问题可以用sudo命令和用户arg来实现: http : //docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo

使用“su”比使用os.setuid()切换用户ID更好。

为什么?

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

我自己没有这样做,但是我看到了几个可能适用的os函数。 从这里开始: http :

此外,在导师列表上有一个线索解决了这个问题: http : //mail.python.org/pipermail/tutor/2002-December/018981.html

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