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

如何成为在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

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

>> 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运行另一个脚本:
    子进程。请检查调用(['sudo','/we/run/as/root')
  • 您可以将脚本设置为“setuidroot”并运行它,无需sudo:
    subprocess.check_调用(['/we/run/as/root'])
    (但是,在许多系统上,这将不起作用,因为脚本上禁用了setuid root)
  • 类似于#2,但使用一个小型C程序,它是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:read
    man 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
    ...