我必须在linux中执行一些命令,但在执行命令之前我需要成为超级用户。 这必须通过python脚本完成 方案是我应该按顺序执行以下命令
>> su
提示输入密码
输入密码后,我将执行bluez命令
>> hciconfig hci0 up
>> hcitool lescan
>> hcitool lecc <address>
我需要在python中执行此操作 但是你能告诉我如何成为超级用户并通过python提供密码然后按顺序执行上述命令吗? 这意味着,我想自动执行所有命令的整个过程,无需人工干预。
答案 0 :(得分:1)
良好的安全措施表明,您应该尽量减少提升权限的时间。一种方法是将命令作为root运行在另一个文件中,然后使该文件以root身份运行。您有几种选择:
subprocess.check_call(['sudo', '/we/run/as/root']);
subprocess.check_call(['/we/run/as/root']);
(但是,在许多系统上,由于脚本上禁用了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;脚本中的子进程调用。您可能不希望没有超级用户访问权限。 如果您的脚本没有做任何非常讨厌的事情,那么以超级用户身份运行脚本会更安全。