running a command as a super user from a python script

后端 未结 8 1167
别跟我提以往
别跟我提以往 2020-11-28 06:15

So I\'m trying to get a process to be run as a super user from within a python script using subprocess. In the ipython shell something like

proc = subproces         


        
相关标签:
8条回答
  • 2020-11-28 07:01

    You have to use Popen like this:

    cmd = ['sudo', 'apache2ctl', 'restart']
    proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    

    It expects a list.

    0 讨论(0)
  • 2020-11-28 07:03

    To run a command as root, and pass it the password at the command prompt, you could do it as so:

    import subprocess
    from getpass import getpass
    
    ls = "sudo -S ls -al".split()
    cmd = subprocess.run(
        ls, stdout=subprocess.PIPE, input=getpass("password: "), encoding="ascii",
    )
    print(cmd.stdout)
    

    For your example, probably something like this:

    import subprocess
    from getpass import getpass
    
    restart_apache = "sudo /usr/sbin/apache2ctl restart".split()
    proc = subprocess.run(
        restart_apache,
        stdout=subprocess.PIPE,
        input=getpass("password: "),
        encoding="ascii",
    )
    
    0 讨论(0)
  • 2020-11-28 07:04

    Try:

    subprocess.call(['sudo', 'apach2ctl', 'restart'])

    The subprocess needs to access the real stdin/out/err for it to be able to prompt you, and read in your password. If you set them up as pipes, you need to feed the password into that pipe yourself.

    If you don't define them, then it grabs sys.stdout, etc...

    0 讨论(0)
  • 2020-11-28 07:09

    Another way is to make your user a password-less sudo user.

    Type the following on command line:

    sudo visudo
    

    Then add the following and replace the <username> with yours:

    <username> ALL=(ALL) NOPASSWD: ALL
    

    This will allow the user to execute sudo command without having to ask for password (including application launched by the said user. This might be a security risk though

    0 讨论(0)
  • 2020-11-28 07:14

    The safest way to do this is to prompt for the password beforehand and then pipe it into the command. Prompting for the password will avoid having the password saved anywhere in your code and it also won't show up in your bash history. Here's an example:

    from getpass import getpass
    from subprocess import Popen, PIPE
    
    password = getpass("Please enter your password: ")
    # sudo requires the flag '-S' in order to take input from stdin
    proc = Popen("sudo -S apach2ctl restart".split(), stdin=PIPE, stdout=PIPE, stderr=PIPE)
    # Popen only accepts byte-arrays so you must encode the string
    proc.communicate(password.encode())
    
    0 讨论(0)
  • 2020-11-28 07:17

    I tried all the solutions, but did not work. Wanted to run long running tasks with Celery but for these I needed to run sudo chown command with subprocess.call().

    This is what worked for me:

    To add safe environment variables, in command line, type:

    export MY_SUDO_PASS="user_password_here"
    

    To test if it's working type:

    echo $MY_SUDO_PASS
     > user_password_here
    

    To run it at system startup add it to the end of this file:

    nano ~/.bashrc  
    

    #.bashrc
    ...
    existing_content:
    
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi
    ...
    
    export MY_SUDO_PASS="user_password_here"
    

    You can add all your environment variables passwords, usernames, host, etc here later.

    If your variables are ready you can run:

    To update:

    echo $MY_SUDO_PASS | sudo -S apt-get update
    

    Or to install Midnight Commander

    echo $MY_SUDO_PASS | sudo -S apt-get install mc
    

    To start Midnight Commander with sudo

    echo $MY_SUDO_PASS | sudo -S mc
    

    Or from python shell (or Django/Celery), to change directory ownership recursively:

    python
    >> import subprocess
    >> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)
    

    Hope it helps.

    0 讨论(0)
提交回复
热议问题