[英]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身份运行。 你有几个选择:
subprocess.check_call(['sudo', '/we/run/as/root']);
subprocess.check_call(['/we/run/as/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.