Domanda

Così sto cercando di ottenere un processo da eseguire come super user dall'interno di uno script Python usando sottoprocesso. Nella shell ipython qualcosa come

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

funziona bene, ma non appena mi attengo in uno script che ho iniziare a ricevere:. sudo: apach2ctl: command not found

Vorrei che questo è dovuto al modo in sudo gestisce ambienti su Ubuntu. (Ho anche provato sudo -E apche2ctl restart e sudo env path=$PATH apache2ctl restart con inutilmente)

Quindi la mia domanda è sostanzialmente, se voglio correre apache2ctl restart come super utente che richiede all'utente di inserire la password di super utente quando richiesto, come dovrei andare a fare questo? Non ho alcuna intenzione di immagazzinare le password nello script.

Modifica:

Ho provato passando i comandi come sia una stringa e token in una lista. Nel interprete Python, con una stringa Prendo la richiesta della password corretta (ancora non funziona in uno script python come nel mio problema originale), un elenco dà solo la schermata di aiuto per sudo.

Modifica 2:

Quindi quello che ho capito è che, mentre Popen lavorerà con alcuni comandi proprio come corde quando shell = True, ci vuole

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])

senza 'shell = True' per ottenere sudo al lavoro.

Grazie!

È stato utile?

Soluzione

Provare a dare il percorso completo di apache2ctl.

Altri suggerimenti

Prova:

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

Il sottoprocesso ha bisogno di accedere al vero e proprio standard input / out / err per essere in grado di richiedere, e leggere la password. Se li si imposta come i tubi, è necessario alimentare la password in quel tubo da soli.

Se non vengono definite, quindi afferra sys.stdout, ecc ...

Un altro modo è quello di rendere l'utente un sudo user senza password.

Digitare la seguente riga di comando su:

sudo visudo

Quindi aggiungere quanto segue e sostituire il <username> con il vostro:

<username> ALL=(ALL) NOPASSWD: ALL

Ciò permetterà all'utente di eseguire il comando sudo senza dover chiedere la password (compresa l'applicazione lanciata dal detto utente. Questo potrebbe essere un rischio per la sicurezza se

Devi usare Popen in questo modo:

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

Si aspetta una lista.

Ho usato questo per Python 3.5. L'ho fatto con sottoprocesso il module.Using la password come questo è molto insicuro .

Il sottoprocesso modulo prende comando come una lista di stringhe quindi o creare un elenco in anticipo utilizzando split () o passare l'intero elenco in seguito. Leggi la documentazione per ulteriori informazioni.

Quello che stiamo facendo qui è riecheggiando la password e quindi utilizzando tubo si passa mai ad sudo attraverso argomento '-S'.

#!/usr/bin/env python
import subprocess

sudo_password = 'mysecretpass'
command = 'apach2ctl restart'
command = command.split()

cmd1 = subprocess.Popen(['echo',sudo_password], stdout=subprocess.PIPE)
cmd2 = subprocess.Popen(['sudo','-S'] + command, stdin=cmd1.stdout, stdout=subprocess.PIPE)

output = cmd2.stdout.read().decode() 

Ho provato tutte le soluzioni, ma non ha funzionato. Volevo correre compiti lunghi in esecuzione con sedano, ma per queste avevo bisogno di eseguire il comando sudo chown con subprocess.call ().

Questo è ciò che ha funzionato per me:

Per aggiungere variabili d'ambiente sicuro, in linea di comando, digitare:

export MY_SUDO_PASS="user_password_here"

Per verificare se si tratta di tipo di lavoro:

echo $MY_SUDO_PASS
 > user_password_here

Per eseguirlo all'avvio del sistema aggiungerlo alla fine di questo file:

nano ~/.bashrc  

#.bashrc
...
existing_content:

  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi
...

export MY_SUDO_PASS="user_password_here"

È possibile aggiungere tutte le variabili d'ambiente password, nomi utente, padrone di casa, ecc qui in seguito.

Se le variabili sono pronti è possibile eseguire:

Per aggiornare:

echo $MY_SUDO_PASS | sudo -S apt-get update

O installare Midnight Commander

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

Per iniziare Midnight Commander con sudo

echo $MY_SUDO_PASS | sudo -S mc

o da shell Python (o Django / sedano), per cambiare la proprietà directory ricorsivamente:

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)

Speranza che aiuta.

Il modo più sicuro per farlo è quello di richiedere la password in anticipo e poi pipe nel comando. La richiesta di conferma per la password verrà evitare di avere la password salvata qualsiasi punto del codice e, inoltre, non apparirà nella vostra storia bash. Ecco un esempio:

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())
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top