繁体   English   中英

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

[英]how to be a super user to run linux commands in python script?

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

>> su

这会提示输入密码

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

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

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

良好的安全实践表明,您应该尽量减少提升权限的时间。 一种方法是将命令作为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"); }

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

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

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

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

您可以使用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
...

你可以在这里阅读更多内容: 使用python pexpect进行自动化

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

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

要么

os.system("ls -l")

如果你的命令是ls -l

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

编辑:如果要以超级用户身份运行子进程 (hciconfig hci0 up), 可以从子进程导入调用调用([“ sudo ”,“hciconfig”,“hci0”,“up”]) 运行

你还必须使用NOPASSWD:

sudo visudo

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

但是我建议您以超级用户身份运行整个脚本,并在脚本中使用“普通”子进程调用。 您可能不希望没有超级用户访问权限。 如果您的脚本没有做任何真正令人讨厌的事情,那么以超级用户身份运行脚本会更安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM