Python - Automatizar encriptación con eCryptfs

 
Vista:
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 04/09/2020 19:31:00
Hola a todos!!

Quiero automatizar con python la encriptación de carpetas con el software, ecryptfs de Ubuntu. Es una tarea con unos 7 pasos que se repiten una y otra vez.

Lo he intentado con los conocimientos que tengo y buscando información en intertnet, parecía que con el módulo subprocess lo iba a solucionar pero No!

Si alguien es tan amable de orientarme un poco estaría agradecido.
Esto es lo que he conseguido hasta ahora:

1
2
import subprocess as sub
montar=sub.run(['sudo -S mount -t ecryptfs ~/lol/ ~/lol/'], shell=True)

Me lanza la terminal y me pide el pass(no de sudo, sino el de ecriptfs) hasta aquí bien. Ahora debería cerrar la terminal y seguir con el proceso.
Pero no lo consigo.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 05/09/2020 10:07:32
Alguna pista de como lanzar una terminal como sudo en Ubuntu desde python y capturar la salida?
Estoy perpido y por más que busco no encuentro o no entiendo como hacerlo.
Graciad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.475
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por joel (901 intervenciones) el 05/09/2020 13:30:28
Hola Anikollaste, no me queda claro que quieres decir con "debería cerrar la terminal y seguir con el proceso"... a que proceso haces referencia al mismo programa?


Otra manera es utilizando Popen... mira este código de ejemplo haber si te sirve: https://www.lawebdelprogramador.com/codigo/Python/4968-Crear-un-archivo-de-backup-de-Mysql-comprimido-con-mysqldump-utilizando-subprocess.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 05/09/2020 19:21:30
Hola Joel.
Ante todo agradecerte la ayuda.

Me he mirado el código pero no acabo de entenderlo, no obstante es un buen punto de partida. Leeré mas sobre subprocess.
Tengo entendido que la diferencia entre el uso de subprocess.run() y subprocess.Popen() deriva en que .Popen() permite seguir con procesos en paralelo mientras que .run() hasta que el primer proceso no termina no continua con el siguiente

En el código me parece que la contraseña está en texto plano..?
1
originPass="contrasena"

Para explicar los pasos que tengo que seguir:

1º)Sólo superusuario puede hacer uso del comando mount, por lo tanto:
>>>sudo mount -t ecryptfs ~/karpeta/ ~/karpeta/
"Aquí me pide pass no de sudo sino de la carpeta a encriptar (Se salta el pass de sudo, cosa que no entiendo)"

2º)Elegir una contraseña
>>>Passphrase:

3º)Elegir un tipo de cifrado
>>>Select cipher:
1) aes: blocksize = 16; min keysize = 16; max keysize = 32
2) blowfish: blocksize = 8; min keysize = 16; max keysize = 56
3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24
4) twofish: blocksize = 16; min keysize = 16; max keysize = 32
5) cast6: blocksize = 16; min keysize = 16; max keysize = 32
6) cast5: blocksize = 8; min keysize = 5; max keysize = 16
Selection [aes]:

4º)Un tipo de llave
>>>Select key bytes:
1) 16
2) 32
3) 24

Y cuatro pasos más...
Muchas gracias.
P.S. Me voy a empapar un poco mas sobre subprocess, haber si hay manera de que lo entienda!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.475
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por joel (901 intervenciones) el 06/09/2020 12:53:39
El sudo se solicita una primera vez, luego en los siguientes N minutos, ya no lo vuelve a pedir.

También puedes configurar sudo para que no solicite nunca la contraseña.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 06/09/2020 19:15:14
Hola de nuevo!!
Entre el código que me aconsejaste y mas que he mirado parece que empiezo a entender 'mejor' como funciona subprocess.

Efectivamente los pasos claves para resolver el problema son:
1-iniciar un proceso como sudo
2-Introducir el pass de la carpeta a encriptar

Estoy obsesionado con darle solución, pero estoy apunto de abandonar...

Aquí me quedo atascado.
1
2
3
4
5
6
7
8
9
10
11
12
import subprocess
 
args=["sudo", "-s"]
 
ini_su=subprocess.run(args, cwd='/home/taicho', capture_output=True, text=True)
leer_montar=subprocess.run(['mount', '-t', 'ecryptfs', 'lol',], capture_output=True, text=True, input=ini_su.stdout)
 
 
if ini_su == 0 or leer_montar == 0:
	print(ini_su.stdout, leer_montar.stdout)
else:
	print(ini_su.stderr, leer_montar.stderr)

Esto me lanza el error:

error_sudo
Y si hago uso de la entrada estandard -S me pide mas argumentos que no entiendo.
Quizá sea mejor dejarlo correr..
Una última pregunta. Cómo sería iniciar un subproceso como sudo?
Gracias por el apoyo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.475
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por joel (901 intervenciones) el 07/09/2020 10:58:44
Una cosa... porque no indicas tu código de python algo así sudo miArchivo.py... de esta manera no tienes que utilizar sudo dentro de tu código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 07/09/2020 19:33:25
Hola Joel.
Esta mañana he tenido la misma idea, de hecho me estoy planteando hacer un script en bash, me estoy informando del manejo de entradas y salidas standars.
Esto el lo que he conseguido:
1
2
3
4
5
6
7
8
import subprocess as sub
 
args=['./sudo.sh']
p1=sub.run(args, shell=False)
 
#siguiente paso
if p1 == '0':
	p2=sub.run()

El script y la salida por terminal:

salida
1º-Me pide pass de sudo, no debería pero... ya me está bien
2º-Me pide pass de la carpeta a encriptar, hasta aquí me parece bien(lo mas importante del programa es precisamente la seguridad).
A partir de aquí se va todo al carajo ya que debería cerrar la ventana y seguir de una manera automática.
Debería saltar de un proceso a otro pero lo hace todo en el mismo (p1) .Lo he intentado con Popen pero el problema es que me lanza los procesos simultáneamente y no se como manejarlo.
El IDE (sublimeText) me lanza esto:

sublime
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 07/09/2020 21:16:14
Perdona parece que no te he entendido bien..
Si shell=True abre terminal listo para introducir el pass de la carpeta a encriptar.

1
2
3
4
5
6
import subprocess as sub
p1=sub.run(['sudo -S mount "-t" ecryptfs ~/lol/ ~/lol/'], shell=True)
 
#siguiente paso
if p1 == '0':
	p2=sub.run()
Tengo entendido que con la shell=Ture hay problemas de seguridad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Anikollaste
Val: 570
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Automatizar encriptación con eCryptfs

Publicado por Anikollaste (118 intervenciones) el 24/09/2020 18:35:03
Hola de nuevo a todos!!
Parece que he conseguido avanzar un poco pero.... Vuelvo a estar atascado.

El problema con el que me encuentro ahora es el Siguiente:
En el proceso p1 le paso los argumentos:
llamada al programa ecryptfs y montar la carpeta mediante mount -t con privilegios de Suy le paso mediante el argumento input la contraseña de Su Hasta aquí bien

Al proceso p2 por fuerza le debo pasar al menos un argumento(le estoy pasando "cat") de lo contrario me arroja error .No sé qué comando pasarle!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import subprocess as sub
from subprocess import PIPE, STDOUT
 
#==================================================
# Pasos >>> pasSudo >>> pasEcry >>>1 >>>2 >>>n >>>n
#==================================================
 
args=['sudo', '-S', 'mount','-t ecryptfs ~/PRUEBA/ ~/PRUEBA/']
pasSudo='passSudo'
pasEcry="passPhrase"
 
p1=sub.run(args,
	input=pasSudo,		# Entrada de datos para el proceso
	stdout=PIPE,		# Si se desea capturar y combinar los dos flujos stderr y stdout, se ha de usar:
	stderr=STDOUT,		# 							stdout=PIPE y stderr=STDOUT en lugar de capture_output.
	text=True,			# Obtener la salida como un texto
	cwd='/home/taicho/',# Ruta directorio de trabajo actual
	shell=False)		# Sin shell interactiva
 
print('Salida de p1: {} >>> Código de retorno {}'.format(p1.stdout, p1.returncode)) # Captura de errores y salidas conbinados
 
if p1.returncode==0:
 
	p2=sub.run(('cat'),
	input=pasEcry,
	stdout=PIPE,
	stderr=STDOUT,
	text=True)
	print('Salida de p2: {} >>> Código de retorno {}'.format(p2.stdout, p2.returncode))
 
	if p2.returncode==0:
 
		p3=sub.run(('cat'),
		input='1',
		stdout=PIPE,
		stderr=STDOUT,
		text=True)
		print('Salida de p3: {} >>> Código de retorno {}'.format(p3.stdout, p3.returncode))
 
		if p3.returncode==0:
			p4=sub.run(('cat'),
			input='2',
			stdout=PIPE,
			stderr=STDOUT,
			text=True)
			print('\nSalida de p4: {} >>> Código de retorno {}'.format(p4.stdout, p4.returncode))
 
			if p4.returncode==0:
				p5=sub.run(('cat'),
				input='n',
				stdout=PIPE,
				stderr=STDOUT,
				text=True)
				print('\nSalida de p5: {} >>> Código de retorno {}'.format(p5.stdout, p5.returncode))
 
				if p5.returncode==0:
					p6=sub.run(('cat'),
					input='n',
					stdout=PIPE,
					stderr=STDOUT,
					text=True)
					print('\nSalida de p6: {} >>> Código de retorno {}'.format(p6.stdout, p6.returncode))

Por cierto no me da ningún error pero tampoco monta la carpeta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar