2016-01-27 29 views
3

我必须在linux中执行几个命令,但在执行命令之前我需要成为超级用户。 这必须通过Python脚本完成 的场景是我应在订货如何成为超级用户在python脚本中运行linux命令?

>> su 

这提示密码

输入密码后,我将不得不执行的bluez命令

执行以下命令
>> hciconfig hci0 up 
>> hcitool lescan 
>> hcitool lecc <address> 

我需要为此在python 但你能告诉我如何成为一个超级用户,并通过Python给密码,然后后来在执行上面的命令订购? 含义,我想自动执行所有命令的整个过程,无需手动干预。

+0

须藤蟒script.py –

+0

参见运行命令['subprocess'](https://docs.python.org/2/library/subprocess.html)模块。我建议用'sudo'运行每个命令,而不是使用'su'。用户只能在第一次被提示输入密码。 – augurar

+2

@sanyesh:读'人sudoers',假设你的Python脚本可以驻留在标准位置和用户的一组给定需要使用它,你可以在“白名单”,要求在'sudoers'文件中超级用户权限的命令和使用'NOPASSWD',这样的脚本甚至可以无人看管。 – 0xC0000022L

回答

-1

根据this你应该使用这样的外部命令:

from subprocess import call 
call(["ls", "-l"]) 

os.system("ls -l") 

如果你的命令ls -l

(对于超级用户权限,我建议你开始Python作为超级用户)。

编辑: 您可以从子进程导入调用运行 调用([“须藤”,‘hciconfig’ ,“hci0”,“up”])如果你想运行子进程(hciconfig hci0)作为超级用户

你也必须使用NOPASSWD:

sudo visudo 

和更改与您的用户名 ALL =(ALL)NOPASSWD:ALL

然而,我建议你运行整个脚本作为一个超级用户,只需在脚本中使用“正常”子进程调用即可。你可能不希望没有超级用户访问权限。 如果您的脚本没有做任何真正令人讨厌的事情,那么以超级用户身份运行脚本会更安全。

+0

不回答问题,即如何以脚本中的超级用户身份运行命令。 – augurar

+0

好吧,我编辑的答案,使其更容易理解 可以调用任何类型的子过程,甚至超级用户。我只是推荐以超级用户身份运行整个脚本,因此您不必使用NOPASSWD,这样可以像运行sudo一样运行单个脚本,从而节省时间。 – ursusd8

0

另一个建议,首先用sudo启动python脚本,当你运行一个非常长的脚本,最后需要sudo权限时,它仍然会要求你重新输入你的密码。

运行脚本没有管理员权限后调用须藤的例子:

import subprocess 
subprocess.call(["sudo", "hcitool", "hci0", "up"]); 

你应该单独像上面显示的每个参数。 正在执行的结果是:'sudo hcitool hci0 up'。

+1

......除非您已将“sudoers”文件中的特定执行命令“白名单”列入特定sudoer并使用了“NOPASSWD”。是的,你可以拥有非常细腻的'sudoers'。 man page在这种情况下确实有帮助。 – 0xC0000022L

+0

@ProjectHardcore ..谢谢你的回复,很抱歉没有明确我的问题,我想自动执行所有命令而不需要手动干预的整个过程。 – sans0909

+1

在这种情况下,我认为下面的页面会做什么@ 0xC0000022L提到的,是你所需要的: [链接](http://askubuntu.com/questions/39281/how-to-run-an-application-using -sudo-没有-A-密码) 您应该添加python脚本到你的“须藤visudo命令”文件。 –

1

良好的安全实践说,你应该尽量减少提升特权的时间。一种方法是将命令作为root运行在不同的文件中,然后使该文件以root身份运行。您有几种选择:

  1. 你的脚本可以使用sudo运行其他脚本:
    subprocess.check_call(['sudo', '/we/run/as/root']);
  2. 你可以使脚本是“setuid的根”,并运行它,没有sudo的需要:
    subprocess.check_call(['/we/run/as/root']);
    (然而,在许多系统上这是行不通的,因为在脚本上禁用了setuid-root)
  3. 像#2但使用一个小的C程序,它是setuid-root并运行脚本:
    subprocess.check_call(['/the/c/program']);基本上C-程序是:
    int main(void) { return system("/we/run/as/root"); }
+1

你应该避免在其文档中使用'os.system()',并且避免调用一个shell。试试'subprocess.check_call(['sudo','/ we/run/as/root'])''。 – tripleee

+0

@John Hascall谢谢你:-) – sans0909

+0

@sanyesh好的建议,回复更新,谢谢, –

0

您可以使用Pexpect的解决您的问题。使用这个python模块,你可以产生一个root shell,发送root密码到进程中,然后执行多个命令。

Pexpect的是一个很好的把戏自动化任何类型的交互shell程序......它工作正常,在这个例子 - 但存储根PW在这样的脚本有严重的安全隐患(将用户添加到sudoers文件,而不密码有严重的安全隐患,以及)...

import pexpect, sys 

# spawn a root shell with sudo or su depending on your linux 
proc = pexpect.spawn("su") 
proc.logfile = sys.stdout 

# wait until the programm finds the string Password or password 
# in the shell output 
proc.expect("[Pp]assword") 
# then: send the password to the waiting shell 
proc.sendline("yourRootPW123") 

# wait until the command completed ("#" is part of the next prompt) 
proc.expect("#") 
# run the whoami command 
proc.sendline("whoami") 

# wait for next prompt 
proc.expect("#") 
proc.sendline("ls -al") 
proc.expect("#") 
# ... 

这将输出:

[email protected]:~$ python script 
[sudo] password for myuser: ************** 

[email protected]:~# whoami 
whoami 
root 
[email protected]:~# ls -al 
ls -al 
total 60 
drwx------ 5 root root 4096 Dez 18 14:38 . 
drwxr-xr-x 23 root root 4096 Jan 21 14:18 .. 
-rw------- 1 root root 13149 Jan 27 10:19 .bash_history 
-rw-r--r-- 1 root root 3106 Feb 20 2014 .bashrc 
... 

你可以阅读更多关于此这里:automate with python pexpect

+0

这将“工作”,但在你的脚本中有这样的密码是一个非常糟糕的主意。 – augurar

+0

@augurar - 你是对的 - 莫名其妙。硬编码密码大多是一个坏主意。将用户添加到没有密码的“sudoers”也可能不好。自动化的问题是:您可以隐藏,加密和外包密码100次 - 您必须知道/存储有效的明文密码 - 这样您才能自动执行整个过程。我建议在企业环境中使用https://www.vaultproject.io/进行“秘密管理”。在这里,用户想知道“...如何通过python提供密码,然后执行上述命令......”这就是答案。没有说它是安全的... – slash4

相关问题