code

Para algunos proyectos necesitamos pasar información de nuestra raspberry a una usb, para esto vamos a mostrar cómo se monta una usb para luego pasar algún archivo.

lsblk

si queremos usar exfat

sudo apt install exfat-fuse

si queremos usar ntfs

sudo apt install ntfs-3g

Con esto vamos a ver en donde tenemos una usb conectado (estoy probando en raspberry pi zero w)

Montar Usb manual

ahora para este tutorial necesitamos que sea FAT32 para esto vamos a poner

sudo fdisk -l
vemos que es fat32

Vamos a crear una carpeta intermermedia

sudo mkdir /media/pi

ahora vamos a montar manualmente

sudo mount /dev/sda1 /media/pi

Con esto ya tenemos nuestra usb montada y podemos acceder a ella, pero si lo desconectamos tendremos que hacer los pasos anteriores.

para esto vamos a automatizar haciendo lo siguiente, vamos a ver cual es el id de nuestra usb montada.

Montar usb automático al iniciar el sistema

ls -l /dev/disk/by-uuid/*
vamos a montar el sda1 automaticamente
sudo nano /etc/fstab

también podemos agregar por id y que es lo recomendado

ls -l /dev/disk/by-uuid/*

para cualquier que pongamos ya sea por id o por nombre ponga la siguiente información

UUID=5C24-1453 /mnt/mydisk FSTYPE defaults,auto,users,rw,nofail 0 0

Si no colocamos nofail no iniciara el sistema.

y ahora damos reboot

solo hay que poner sudo mount -a para montar siempre nuestro usb

Montar usb automáticamente con python

sabiendo todo lo anterior usaremos la primera sección pero en vez de hacerlo manual vamos a hacer un script que detecte la conexión y monte en automático.

lsblk -b /dev/sd* -J con esta líneas nos trae la información de los usb conectados, con -J nos trae en formato json y es más fácil manejarlo en python parseando con JSON.

subprocess usando output nos trae en texto las respuestas de la consola, pero en especial con lsblk no se puede leer así que podemos usar el siguiente comando.

process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
output = process.communicate()

El código completo:

import json
import os
import subprocess
import requests
import time

url = "https://api.telegram.org/bot"
botkey = "812454574:AAFeS5HZ9EW0QvShfcFMYqs3aUaHBwulADP"
privado  = 245614688

def mensaje(urls, text, chat_id):
    try:
        smsn = url+"{}/sendMessage?chat_id={}&text={}".format(botkey,str(chat_id),text)
        requests.post(smsn)
    except:
        pass
    

mensaje(url,'- iniciando automount 🤖 -' , privado)

while True:

    
    try:

        command = "lsblk -b /dev/sd* -J"
        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True)
        output = process.communicate()

        usbx = str(output[0]).replace("b",'', 1).replace("'",'').replace('\\n','')
        jusb = json.loads(usbx)
        
    except:
        print("error_ listado")
        

    try:
        if len(jusb['blockdevices'][0]['children']) > 0:
            n = 0
            for name in jusb['blockdevices'][0]['children']:
                # print(name['name'])
                mnt = subprocess.check_output('mount', shell=True)
                if str(mnt).find(name['name']) > 0:
                    print('ya esta montado')
                else:
                    if n == 0:
                        pathusb = 'sudo mount /dev/{} /media/pi'.format(name['name'])
                        # print (pathusb)

                    else:
                        print(jusb['blockdevices'][0]['children'][n - 1]['name'])
                        if (jusb['blockdevices'][0]['children'][n - 1]['name'] != name['name']):  
                            pathusb = 'sudo mount /dev/{} /media/pi{}'.format(name['name'],n)
                        else:
                            pathusb = ''
                    if (pathusb != ''):
                        x = subprocess.call(pathusb, shell=True)
                        mensaje(url, 'montado ' + name['name'], privado)
                    n += 1
                    # print(x)
                    # print('montado ' + name['name'])

    except:
        pass
        
    time.sleep(30)




gitlab

por Cesar Flores

Programador de tiempo completo, Gamer de medio tiempo y fotógrafo ocasionalmente, me gusta el front-end y mi framework favorito es angular aunque no por eso le hago el feo a un nuevo lenguaje.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.