Como saber qual sdb é um pendrive USB?

2

Eu escrevi um script que formata o USB pendrive e coloca mídia nele. Ajuda as pessoas em uma biblioteca a obter um monte de HTML e mídia para procurar dados históricos (versão oficial).

Todo o meu script faz bem o trabalho (formatar, montar, copiar, desmontar, dizer "adeus"). Mas um ponto: como saber qual dispositivo devo procurar.

Uma única condição: ainda há um máximo de 1 pendrive plugado.

Geralmente, há 3 pessoas por dia chegando para conectar seu pendrive (USB!) na máquina (parece uma máquina para cartão de crédito).

Minha pergunta Por favor, ajude, eu não sei o que fazer para dizer o meu script:

  

Ei, o único dispositivo USB é o / dev / sdX1

Ou

  

Ei, não há USB pendrive na minha E / S.

Obrigado

    
por 3pic 20.08.2015 / 15:12

2 respostas

1

Usando find e awk

#!/bin/bash

# your code ...

# The name of your MAXimum 1 drive in /media/$USER
maximum1="MAXimum 1"

if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d |\
    awk '! /'"$maximum1"'/')" ]
then
    echo "Hey, the only USB device is $maximum1"
else
    echo "Hey, no USB pendrive in my I/O."
fi

# your code ...

Exemplo

% ls -laog /media/$USER

total 24
drwxr-x---+ 3  4096 Aug 20 15:16 .
drwxr-xr-x  5  4096 Aug 18 08:43 ..
drwxr-xr-x  8 16384 Jan  1  1970 STORE N GO

% maximum1="STORE N GO"; if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d | awk '! /'"$maximum1"'/')" ]; then echo "Hey, the only USB device is $maximum1"; else echo "Hey, no USB pendrive in my I/O."; fi
Hey, the only USB device is STORE N GO

% maximum1="NOT STORE N GO"; if [ -z "$(find /media/$USER/ -maxdepth 1 ! -path /media/$USER/ -type d | awk '! /'"$maximum1"'/')" ]; then echo "Hey, the only USB device is $maximum1"; else echo "Hey, no USB pendrive in my I/O."; fi
Hey, no USB pendrive in my I/O.
    
por A.B. 20.08.2015 / 15:31
1

O Ubuntu possui um comando puro udisksctl , que permite pesquisar informações com a opção info em um dispositivo de bloco especificado com o sinal -b .

Agora, se analisarmos a saída de udiskctl para cada dispositivo de bloco de a para z e procurarmos a string 'usb', podemos ter certeza de que é um dispositivo USB.

Abaixo está um script que faz exatamente isso:

#!/bin/bash

FOUND=0
for var in {a..z}; do 

    udisksctl info -b /dev/sd$var 2>/dev/null | grep -q 'usb'; 
    if [ $(echo $?) -eq 0 ]; then 
        echo " FOUND USB DEVICE /dev/sd$var "; 
        FOUND=1
    fi 


done 

if [ $FOUND -eq 0 ]; then
    echo "NO USB DEVICES FOUND"
fi

Aí temos FOUND flag, que serve apenas para o propósito de imprimir "NO USB DEVICES FOUND" se ... bem ... se não forem encontrados dispositivos USB! Caso contrário, se encontrarmos pelo menos um dispositivo USB, definimos esse sinalizador como 1 e o ignoramos.

Veja a saída de amostra com dois USBs conectados e removidos:

CURRENT DIR:[/home/xieerqi]
$ ./bin/sh/findusb.sh                                                                                                                         
 FOUND USB DEVICE /dev/sdb 
 FOUND USB DEVICE /dev/sdc 

CURRENT DIR:[/home/xieerqi]
$ ./bin/sh/findusb.sh                                                                                                                         
NO USB DEVICES FOUND

Sinta-se à vontade para modificar este script de acordo com sua necessidade.

    
por Sergiy Kolodyazhnyy 20.08.2015 / 16:23