如何成为超级用户在python脚本中运行linux命令?

时间:2016-01-27 08:29:14

标签: python linux

我必须在linux中执行一些命令,但在执行命令之前我需要成为超级用户。 这必须通过python脚本完成 方案是我应该按顺序执行以下命令

>> su

提示输入密码

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

>> hciconfig hci0 up
>> hcitool lescan
>> hcitool lecc <address>

我需要在python中执行此操作 但是你能告诉我如何成为超级用户并通过python提供密码然后按顺序执行上述命令吗? 这意味着,我想自动执行所有命令的整个过程,无需人工干预。

4 个答案:

答案 0 :(得分:1)

良好的安全措施表明,您应该尽量减少提升权限的时间。一种方法是将命令作为root运行在另一个文件中,然后使该文件以root身份运行。您有几种选择:

  1. 您的脚本可以使用sudo运行其他脚本:
    subprocess.check_call(['sudo', '/we/run/as/root']);
  2. 您可以将脚本设置为'setuid-root'并运行它,不需要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"); } < / LI>

答案 1 :(得分:0)

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

在没有管理员权限的情况下运行脚本后调用sudo的示例:

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

您应该分离每个参数,如上所示。 正在执行的结果将是:&#39; sudo hcitool hci0 up&#39;。

答案 2 :(得分:0)

您可以使用 pexpect 来解决您的问题。使用此python模块,您可以生成根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("#")
# ...

这将输出:

myuser@lnx-work:~$ python script
[sudo] password for myuser: **************

root@lnx-work:~# whoami
whoami
root
root@lnx-work:~# 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

答案 3 :(得分:-1)

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

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

os.system("ls -l")

如果您的命令是ls -l

(对于超级用户权限,我建议您以超级用户身份启动python。)

编辑: 你可以跑     来自子进程导入调用     如果你打电话([&#34; sudo &#34;,&#34; hciconfig&#34;,&#34; hci0&#34;,&#34; up&#34;])希望以超级用户身份运行子流程(hciconfig hci0 up)

您还必须使用NOPASSWD:

sudo visudo

并使用您的用户名更改a      ALL =(ALL)NOPASSWD:ALL

但是我建议您以超级用户身份运行整个脚本,并使用&#34; normal&#34;脚本中的子进程调用。您可能不希望没有超级用户访问权限。 如果您的脚本没有做任何非常讨厌的事情,那么以超级用户身份运行脚本会更安全。