我正在写一个简单的脚本,重新启动一个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')
我在这里有三个问题,
os.system是我可以用来发行linux命令的最好命令吗?
我可以通过上面的命令从root用户更改为用户hadoop,但我无法更改为root用户(我可以理解,如果他们允许这样做会有安全问题,我想知道是否有任何可能做到这一点,至less通过传递密码)?
os.setuid()是否工作? whoami打印用户hadoop但进程“tasktracker”不停止使用这些命令,但如果我手动执行相同的命令,它工作正常(手动尝试出来时,我使用“su hadoop”而不是setuid)。
感谢你的帮助。
你可以使用:
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更好。
为什么?
我自己没有这样做,但是我看到了几个可能适用的os函数。 从这里开始: http :
此外,在导师列表上有一个线索解决了这个问题: http : //mail.python.org/pipermail/tutor/2002-December/018981.html
os.system方法是有限的,因为它只返回一个错误代码。 subprocess.Popen工具集更加灵活。