在Python中切换用户

8 投票
4 回答
39746 浏览
提问于 2025-04-17 05:44

我正在写一个简单的脚本,用来重启一个 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 用户(我明白如果允许这样做会有安全问题,我想知道有没有可能做到这一点,至少通过输入密码)?

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

谢谢大家的帮助。

  • Sethu

4 个回答

1

这种脚本可以通过使用fabric库来实现得更简单、更干净。你可以在这里找到相关文档:http://docs.fabfile.org/en/1.3.1/index.html。这个库还提供了很好的命令行界面,并且可以通过ssh来管理远程服务器。所有的python功能都可以用,所以你可以连接到数据库,或者导入你需要的任何东西。

关于以其他用户身份运行命令的问题,可以使用sudo命令,并加上用户参数来实现。具体可以参考这个链接:http://docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo

3

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

为什么呢?

  • “su”会正确设置登录信息,包括用户组ID和附加用户组。
  • “su”还会做一些其他有用的事情,比如设置环境变量(特别是如果你使用su -的话)。也许它还会根据limits.conf设置一些限制。
7

你可以使用:

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

或者如果你没有sudo权限,但有su权限的话,可以使用:

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

撰写回答