» »

[Python / Linux] Zagon ukaza z root privilegiji

[Python / Linux] Zagon ukaza z root privilegiji

morbo ::

OK, taka je stvar; Imam skripto ki izvaja neka opravila (odpre poljubno število procesov, ki lahko trajajo poljubno dolgo). Rad bi da po končanem delu skripta izvede shutdown sistema, kar seveda zahteva root privilegij. Opravila ki jih izvaja skripta se ne smejo izvajat v root načinu, zato ob zagonu (iz konzole) uporabnik vpiše geslo, ki se ga shrani in potem na koncu uporabi za shutdown.

Primer kode:

import sys
import getpass
from subprocess import Popen, PIPE

if __name__ == "__main__":
	password = getpass.getpass("Enter password [return to skip] -> ")
	if not password:
		sys.exit(1)
	# izvajaj opravila v user nacinu
	#...
	# pozeni ukaz kot superuser
	command = "sudo ls -l" #testni ukaz
	proc = Popen(command, stdin=PIPE, shell=True)
	proc.stdin.write(password)
	proc.stdin.flush()
	print("end")


Ob zagonu tega je rezultat isti kot da bi se 3x prijavil z nepravilnim geslom (geslo vpišem pravilno), torej je nekaj narobe s tem kako je string zapisan v tok. Ima kdo kako idejo?

jiga ::

Tale parameter dodej pr sudo:

       -S          The -S (stdin) option causes sudo to read the password from
                   the standard input instead of the terminal device.  The
                   password must be followed by a newline character.


Namest da shranjujes password lahko tudi zazenes svoj python program kot root, in potem ostale programe, ki ne rabijo roota, kot nek drug user (sudo -u username).

       -u user     The -u (user) option causes sudo to run the specified
                   command as a user other than root.  To specify a uid
                   instead of a user name, use #uid.  When running commands as
                   a uid, many shells require that the '#' be escaped with a
                   backslash ('\').  Note that if the targetpw Defaults option
                   is set (see sudoers(5)) it is not possible to run commands
                   with a uid not listed in the password database.

Zgodovina sprememb…

  • spremenil: jiga ()

morbo ::

ooo, jiga, hvala! :)
(silly me, ker sploh nisem pogledal v sudo dokumentacijo...)

Še delujoč primer, če koga zanima:

import sys
import getpass
from subprocess import Popen, PIPE, STDOUT

if __name__ == "__main__":
	password = getpass.getpass("Enter password [return to skip] -> ")
	if not password:
		sys.exit(1)
	password += "\n"
	command = "sudo -S ls -l"
	proc = Popen(command, stdin=PIPE, stdout=PIPE, stderr=STDOUT, shell=True)
	stdout = proc.communicate(bytes(password, "utf-8"))[0]
	print(stdout.decode("utf-8"))


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211465 (1075) noraguta
»

Električno stikalo z oddaljenim nadzorom

Oddelek: Elektrotehnika in elektronika
131389 (908) Torx
»

Kako narediti python "cmd line" program

Oddelek: Programiranje
111609 (1032) ragezor
»

problem pri sprembi root gesla v MySQL v Ubuntu

Oddelek: Pomoč in nasveti
231286 (866) killa bee
»

Update SVN preko Apache (PHP)

Oddelek: Operacijski sistemi
51042 (984) Karlos

Več podobnih tem