¿Cómo puedo crear (y eliminar si está desconectado) un enlace simbólico al punto de montaje de un dispositivo USB recién conectado en el escritorio o en $HOME de la cuenta de invitado del sistema?
Respuesta1
Su pregunta resulta ser de dos preguntas separadas:
- Cómo crear (y eliminar) automáticamente un enlace en el escritorio a unidades USB montadas
- Cómo ejecutarlo en una cuenta de invitado
Estas preguntas se responden a [1.]
continuación [2.]
.
1. Cree automáticamente un enlace de escritorio a las unidades USB montadas (en general)
Con un pequeño script en segundo plano, puede crear automáticamente un enlace en su escritorio a las unidades USB montadas,yeliminarlo automáticamente si se retira la unidad.
El procedimiento; cómo funciona
El siguiente script es una versión editada deÉste. Esta versión:
- vigila los dispositivos recién montados (usando el comando
lsblk
) - si aparece un elemento nuevo, verifica si el dispositivo recién montado es un
usb
dispositivo mediante el comando:find /dev/disk -ls | grep <disk>
. Si estáusb
en la salida, el nuevo montaje es válido. - si el montaje es válido, se crea un enlace en el escritorio del usuario, con el comando:
ln -s <new_mount> <target>
.
El enlace de destino se llama:[USB] <devicename>
.
Al mismo tiempo
- La nueva montura se agrega a una lista. periódicamente (una vez cada cuatro segundos), se comprueba la lista. Si el montaje ya no existe, su enlace correspondiente se elimina de su escritorio.
Como instalar
- Copie el siguiente script en un archivo vacío y guárdelo como
show_usb.py
cree el directorio
/opt/show_usb
(ya que queremos ejecutarlo para una cuenta de invitado):sudo mkdir /opt/show_usb
Copie el script en
/opt/show_usb
:sudo cp /path/to/show_usb.py /opt/show_usb
Pruebe el script desde una terminal con el comando:
python3 /opt/show_usb/show_usb.py
Si todo funciona bien, agréguelo a Aplicaciones de inicio: Tablero > Aplicaciones de inicio > Agregar. Agregue el comando:
python3 /opt/show_usb/show_usb.py
La secuencia de comandos
#!/usr/bin/env python3
import os
import subprocess
import time
def find_dtop():
# get the localized path to the Desktop folder
home = os.environ["HOME"]; dr_file = home+"/.config/user-dirs.dirs"
return [home+"/"+ l.split("/")[-1].strip() \
for l in open(dr_file).readlines() \
if l.startswith("XDG_DESKTOP_DIR=")][0].replace('"', "")
def get_mountedlist():
return [(item.split()[0].replace("├─", "").replace("└─", ""),
item[item.find("/"):]) for item in subprocess.check_output(
["lsblk"]).decode("utf-8").split("\n") if "/" in item]
def identify(disk):
cmd = "find /dev/disk -ls | grep /"+disk
output = subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
return True if "usb" in output else False
done = []; check = []
dt = find_dtop()
while True:
mnt = get_mountedlist(); mount_check = [item[1] for item in mnt]
for item in check:
if not item in mount_check:
try:
os.remove(dt+"/[USB] "+item.split("/")[-1]); check.remove(item)
except FileNotFoundError:
pass
new_paths = [dev for dev in mnt if not dev in done and not dev[1] == "/"]
valid = [dev for dev in new_paths if identify(dev[0]) == True]
for item in valid:
new = item[1]
subprocess.Popen(["ln", "-s", new, dt+"/[USB] "+new.split("/")[-1] ])
check.append(new)
time.sleep(4)
done = mnt
2. Cómo ejecutar automáticamente el script, específicamente en la cuenta de invitado
Para hacer que el script se inicie automáticamente en una sesión de invitado:
Mira si el directorio
/etc/guest-session/skel/.config/autostart
existe. Si no, créalo:sudo mkdir -p /etc/guest-session/skel/.config/autostart
Ahora cree un iniciador de inicio para la cuenta de invitado:
sudo -i gedit /etc/guest-session/skel/.config/autostart/desktop_usb.desktop
En el archivo que se abre, pegue el siguiente código:
[Desktop Entry] Name=USB_desktop Exec=python3 /opt/show_usb/show_usb.py Type=Application
Guarde y cierre el archivo. Ahora, cuando inicie sesión en la cuenta de invitado, se ejecutará el script.
Eso es todo
Notas
- Más sobre cómo editar la cuenta de invitadopara ser encontrado aquí.
- El script sólo actúa si se monta una nueva unidad y no agrega ninguna carga notable al procesador.