6

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

感谢你的帮助。

  • 塞图
4

4 回答 4

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"')
于 2011-11-06T07:20:27.650 回答
3

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

为什么?

  • "su" 将正确设置登录凭据,包括组 ID 和补充组
  • "su" 还会做其他有用的事情,例如设置环境变量(特别是如果您使用 su - )。也许它还会根据limits.conf设置ulimit限制。
于 2011-11-06T14:23:42.107 回答
1

使用结构库可以更清洁地实现这种脚本:http: //docs.fabfile.org/en/1.3.1/index.html 此外,它提供了很好的命令行界面和通过 ssh 进行远程服务器管理的功能. 所有 python 都可用,因此您可以连接到数据库或导入您需要的任何内容。

关于以其他用户身份运行命令的确切问题可以通过用户 arg 的 sudo 命令来实现:http: //docs.fabfile.org/en/1.3.1/api/core/operations.html#fabric.operations.sudo

于 2011-11-06T12:28:35.247 回答
0

我自己没有这样做,但我看到了几个可能适用的操作系统功能。他们从这里开始:http: //docs.python.org/library/os.html#os.setegid

此外,导师名单上有一个主题讨论了这个话题: http: //mail.python.org/pipermail/tutor/2002-December/018981.html

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

于 2011-11-06T05:15:31.567 回答