first - python module docstring



Verwenden von Sudo mit Python-Skript (7)

Ich versuche, jedes Mal, wenn ich das Skript ausführe, ein kleines Skript zu schreiben, um einen freigegebenen VirtualBox-Ordner bereitzustellen. Ich möchte es mit Python machen, weil ich versuche, es für das Scripting zu lernen.

Das Problem ist, dass ich Berechtigungen brauche, um den Befehl mount zu starten. Ich könnte das Skript als sudo ausführen, aber ich bevorzuge es, um sudo zu machen.

Ich weiß bereits, dass es nicht sicher ist, Ihr Passwort in eine .py-Datei zu schreiben, aber wir sprechen über eine virtuelle Maschine, die überhaupt nicht kritisch ist: Ich möchte nur auf das .py-Skript klicken und es zum Laufen bringen.

Das ist mein Versuch:

#!/usr/bin/env python
import subprocess

sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'

subprocess.Popen('sudo -S' , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(sudoPassword , shell=True,stdout=subprocess.PIPE)
subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)

Meine Python-Version ist 2.6


Answer #1

Bitte versuchen Sie das Modul pexpect. Hier ist mein Code:

import pexpect
remove = pexpect.spawn('sudo dpkg --purge mytool.deb')
remove.logfile = open('log/expect-uninstall-deb.log', 'w')
remove.logfile.write('try to dpkg --purge mytool\n')
if remove.expect(['(?i)password.*']) == 0:
    # print "successfull"
    remove.sendline('mypassword')
    time.sleep(2)
    remove.expect(pexpect.EOF,5)
else:
    raise AssertionError("Fail to Uninstall deb package !")

Answer #2

Ich habe das für Python 3.5 benutzt. Ich habe es mit Subprocess-Modul.Verwenden Sie das Passwort so ist sehr unsicher .

Das subprocess nimmt Befehle als eine Liste von Zeichenfolgen, so dass entweder zuvor eine Liste mit split () erstellt wird oder die ganze Liste später übergeben wird. Lesen Sie die Dokumentation für weitere Informationen.

#!/usr/bin/env python
import subprocess

sudoPassword = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'.split()

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

output = cmd2.stdout.read.decode()

Answer #3

Um das Passwort an sudo 's stdin zu übergeben:

#!/usr/bin/env python
from subprocess import Popen, PIPE

sudo_password = 'mypass'
command = 'mount -t vboxsf myfolder /home/myuser/myfolder'.split()

p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE,
          universal_newlines=True)
sudo_prompt = p.communicate(sudo_password + '\n')[1]

Hinweis: Sie SUDO_ASKPASS Befehl passwordless sudo oder SUDO_ASKPASS möglicherweise konfigurieren, anstatt Ihr Kennwort im Quellcode fest zu codieren.


Answer #4

Um zu begrenzen, was Sie als sudo ausführen, könnten Sie laufen

python non_sudo_stuff.py
sudo -E python -c "import os; os.system('sudo echo 1')"

ohne das Passwort speichern zu müssen. Der Parameter -E gibt das -E des aktuellen Benutzers an den Prozess weiter. Beachten Sie, dass Ihre Shell nach dem zweiten Befehl sudo priveleges haben wird.


Answer #5

manchmal erfordern einen Wagenrücklauf:

os.popen("sudo -S %s"%(command), 'w').write('mypass\n')

Answer #6

subprocess.Popen erstellt einen Prozess und öffnet Pipes und Zeug. Was du tust ist:

  • Starten Sie einen Prozess sudo -S
  • Starten Sie einen Prozess mypass
  • Starten Sie einen Prozess mount -t vboxsf myfolder /home/myuser/myfolder

was offensichtlich nicht funktionieren wird. Sie müssen die Argumente an Popen übergeben. Wenn Sie sich die Dokumentation ansehen, werden Sie feststellen, dass das erste Argument tatsächlich eine Liste der Argumente ist.


Answer #7
  • Verwenden Sie im Befehl sudo die Option -S, die angibt, dass das Kennwort von "stdin" anstelle des Endgeräts gelesen werden soll.

  • Sagen Sie Popen, dass er von PIPE stdin lesen soll.

  • Senden Sie das Passwort an die stdin PIPE des Prozesses, indem Sie es als Argument für die Methode verwenden. Vergessen Sie nicht, am Ende des Kennworts ein neues Zeilenzeichen '\ n' einzufügen.

sp = Popen(cmd , shell=True, stdin=PIPE)
out, err = sp.communicate(_user_pass+'\n')   




subprocess