Desenvolver um script bash usando variáveis

0

A cada reinicialização, as atribuições de porta USB de um scanner conectado estão incorretas. Meu objetivo é criar um script que seja executado na reinicialização, eliminando minha interação.

Veja o que faço manualmente para corrigir as atribuições de porta.

    1) lsusb -d 04f9:0272  #the output identifies the correct ports of the scanner       
    2) sudo chmod a+w /dev/bus/usb/001/002 #scanner now works

O script a seguir cria as variáveis, mas chmod falha ao informar "nenhum arquivo ou diretório".

    buss=$(lsusb -d 04f9:0272 |awk '{print $2}')
    devis=$(lsusb -d 04f9:0272 |awk '{print $4}')
    sudo chmod a+w /dev/bus/usb/$buss/$devis

Os valores corretos são exibidos quando eu faço eco de $ buss ou $ devis. Eu sei que precisarei fazer mais para automatizar esse processo.

    
por Guy D'Amico 23.07.2017 / 21:51

3 respostas

1

O problema é provavelmente a formatação específica da lsusb output:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:

Observe o cólon extra no final. Felizmente você pode facilmente removê-lo, seja no awk ou no shell, aqui está um exemplo de awk:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001
    
por 23.07.2017 / 22:12
1

Parece que isso deve funcionar, exceto que a saída de lsusb contém dois pontos após o número do dispositivo:

$ lsusb -d 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Portanto, a variável devis conteria isso, e o resultado final seria que você tentaria acessar /dev/bus/usb/001/001: com os dois pontos.

Você pode se livrar do cólon final com a expansão de supressão de sufixo, assim:

devis=${devis%:}

Outra maneira de fazer isso apenas no shell (sem awk ) seria apenas read da saída de lsusb . Isso leva apenas a primeira linha lsusb outputs, pode haver mais se houver mais de um dispositivo correspondente.

Em cascas com substituição de processo:

read x buss x devis x < <(lsusb -d 04f9:0272)
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"

Ou com um pipe:

lsusb -d 04f9:0272 | {
   read x buss x devis x
   devis=${devis%:}
   chmod +w "/dev/bus/usb/$buss/$devis"
}
    
por 23.07.2017 / 22:12
1

Nos comentários, você fornece a saída de ls -l para seu dispositivo:

crw-rw-r-- 1 root lp 189, 1 Jul 24 18:48 /dev/bus/usb/001/002

Você pode ver que o usuário e o grupo já têm acesso de leitura / gravação. Então, se você adicionar seus usuários ao grupo lp , nada deste material de script permanece necessário.

    
por 25.07.2017 / 01:14