如何成为在python脚本中运行linux命令的超级用户?
我必须在linux中执行一些命令,但在执行命令之前,我需要成为超级用户。 这必须通过python脚本完成 场景是我应该按照以下顺序执行以下命令如何成为在python脚本中运行linux命令的超级用户?,python,linux,Python,Linux,我必须在linux中执行一些命令,但在执行命令之前,我需要成为超级用户。 这必须通过python脚本完成 场景是我应该按照以下顺序执行以下命令 >> su 这将提示输入密码 输入密码后,我必须执行bluez命令 >> hciconfig hci0 up >> hcitool lescan >> hcitool lecc <address> >hciconfig hci0 up >>hcitool lescan >>hcitool-l
>> su
这将提示输入密码
输入密码后,我必须执行bluez命令
>> hciconfig hci0 up
>> hcitool lescan
>> hcitool lecc <address>
>hciconfig hci0 up
>>hcitool lescan
>>hcitool-lecc
我需要用python来做这件事
但是你能告诉我如何成为一个超级用户,并通过python给出密码,然后按顺序执行上面的命令吗?
也就是说,我想自动化执行所有命令的整个过程,而无需手动干预。根据您的要求,您应该使用如下外部命令:
from subprocess import call
call(["ls", "-l"])
或
如果您的命令是ls-l
(对于超级用户权限,我建议您以超级用户身份启动python。)
编辑:
你可以跑
从子流程导入调用
如果希望以超级用户身份运行子进程,请调用([“sudo”、“hciconfig”、“hci0”、“up”])
您还必须使用NOPASSWD:
sudo visudo
并使用您的用户名更改a
ALL=(ALL)NOPASSWD:ALL
但是,我建议您以超级用户的身份运行整个脚本,并在脚本中使用“普通”子流程调用。您可能不想拥有无通行证超级用户访问权限。
如果您的脚本没有做任何令人讨厌的事情,那么以超级用户身份运行脚本会更安全。另一个建议是,最初使用sudo启动python脚本时,当您运行一个非常长的脚本,最后需要sudo权限时,仍然需要您重新输入密码 在没有管理员权限的情况下运行脚本后调用sudo的示例:
import subprocess
subprocess.call(["sudo", "hcitool", "hci0", "up"]);
您应该像上面所示那样分离每个参数。
正在执行的结果将是:“sudo hcitool hci0 up”。良好的安全实践表明,您应该尽量减少处于提升权限的时间。一种方法是将要以root身份运行的命令放在另一个文件中,然后使该文件以root身份运行。您有几个选择:
子进程。请检查调用(['sudo','/we/run/as/root')代码>
subprocess.check_调用(['/we/run/as/root'])代码>
(但是,在许多系统上,这将不起作用,因为脚本上禁用了setuid root)
子进程。检查调用(['/the/C/program'])代码>基本上C程序是:
intmain(void){returnsystem(“/we/run/as/root”);}
您可以使用pexpect来解决您的问题。使用这个python模块,您可以生成一个根shell,向进程发送根密码,然后执行多个命令 pexpect是一个很好的技巧,可以自动执行任何类型的交互式shell程序。。。在本例中,它运行良好-但是在这样的脚本中存储根PW会带来严重的安全隐患(向sudoers添加没有密码的用户也会带来严重的安全隐患) 这将输出:
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
...
您可以在此处阅读更多信息:sudo python script.py请参阅模块以了解如何运行命令。我建议不要使用
su
,而是使用sudo
运行每个命令。只有在第一次提示用户输入密码。@sanyesh:readman sudoers
,假设您的Python脚本可以驻留在标准位置,并且给定的用户组需要使用它,您可以在sudoers
文件中“白名单”需要超级用户权限的命令,并使用NOPASSWD
,所以这样的脚本甚至可以在无人值守的情况下运行。@0xC000002L谢谢you@augurar谢谢,如何在没有手动干预的情况下自动化此过程并没有回答问题,即如何在脚本中以超级用户的身份运行命令。好的,我正在编辑答案以使其更易于理解。您可以调用任何类型的子过程,甚至作为超级用户。我只是建议您以超级用户的身份运行整个脚本,这样您就不必使用NOPASSWD,这比以sudo的形式运行单个脚本要少。。。。除非您已将特定sudoer的sudoers
文件中执行的特定命令“白名单”,并使用了NOPASSWD
。是的,您可以拥有非常细粒度的sudoers
。在这种情况下,手册页真的很有帮助。@ProjectHardcore。。谢谢你的回复,很抱歉没有把我的问题说清楚,我想自动化执行所有命令的整个过程,而无需手动干预。在这种情况下,我认为下一页将完成@0xC000002L提到的,也是您需要的:您应该将python脚本添加到“sudo visudo”文件中。@sanyesh您尝试过我上面提到的链接吗?它应该可以解决您的问题,因为它可以自动完成您在问题注释中要求的过程。@ProjectHardcore我确实尝试在%sudo ALL=(ALL)NOPASSWD:/home/username/some_文件下面添加username ALL=(ALL:ALL)行全部的其中username是我的用户名,而某个_文件是一个包含上述所有命令的.sh文件。现在我转到python并执行os.system('sudo/home/username/some_file'),它仍然要求输入sudo密码,我现在该怎么办?您应该避免像它在文档中所说的那样os.system()。尝试子流程。改为检查_调用(['sudo','/we/run/as/root'])
。这将“起作用”,但在脚本中使用这样的密码是一个非常糟糕的主意。@augurar-你是对的-不知何故。
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
...