Como reiniciar um dispositivo USB sem desconectar o cabo

Publicado por Fábio Berbert de Paula em 22/07/2020

[ Hits: 1.231 ]

Blog: https://youtube.com/c/cotidianohackeado

 


Como reiniciar um dispositivo USB sem desconectar o cabo



Em algum momento essa dica pode ser útil para você. Por exemplo, recarregar um pendrive que foi desmontado sem precisar desplugar e plugar novamente e por aí vai...

Você irá precisar compilar um pequeno programa em C:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
   const char *filename;
   int fd;
   int rc;

   if (argc != 2) {
      fprintf(stderr, "Usage: usbreset device-filename\n");
      return 1;
   }
   filename = argv[1];

   fd = open(filename, O_WRONLY);
   if (fd < 0) {
      perror("Error opening output file");
      return 1;
   }

   printf("Resetting USB device %s\n", filename);
   rc = ioctl(fd, USBDEVFS_RESET, 0);
   if (rc < 0) {
      perror("Error in ioctl");
      return 1;
   }
   printf("Reset successful\n");

   close(fd);
   return 0;
}

Salve o código acima em um arquivo chamado usbreset.c e compile:

cc usbreset.c -o usbreset

Agora vamos listar os dispositivos USB conectados ao seu PC:

usb-devices | egrep '(Bus|Product)'
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 2
S: Product=EHCI Host Controller
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 6
T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
S: Product=USB PnP Audio Device
T: Bus=01 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=1.5 MxCh= 0
S: Product=USB KEYBOARD
T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=03 Dev#= 5 Spd=1.5 MxCh= 0
S: Product=USB Trackball
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 4
S: Product=xHCI Host Controller
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
S: Product=Logitech Webcam C925e
T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 2
S: Product=EHCI Host Controller
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 8
T: Bus=03 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 4 Spd=12 MxCh= 7
S: Product=USB 2.0 Hub [Safe]
T: Bus=03 Lev=03 Prnt=04 Port=00 Cnt=01 Dev#= 7 Spd=12 MxCh= 0
S: Product=Redmi Note 8 Pro
T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=5000 MxCh= 4
S: Product=xHCI Host Controller


Para este exemplo vou reiniciar a porta USB do meu celular Redmi Note 8 Pro, que está na Bus 03, Prnt 04:

./usbreset /dev/bus/usb/003/004

DICA: use a tecla TAB para autocompletar o caminho do dispositivo acima.

Até a próxima!

Outras dicas deste autor

Configurando Winmodens no Linux

Agendando tarefas com Python (schedule)

Skype Call Recorder - Como gravar áudio de chamadas do Skype

Evitando vulnerabilidades em seu servidor NFS

Como somar todos os números contidos num arquivo texto

Leitura recomendada

Driver da nvidia em mais de um kernel no Slackware

Ubuntu: kernel atualizado com bootsplash

Recompilando o kernel sem apagar o atual

Compilando kernel 3.16.1 no Fedora 20

Nova versão de driver da nVidia: perfeita para o kernel 2.6! :)

  

Comentários
[1] Comentário enviado por mauricio123 em 22/07/2020 - 11:38h


Excelente. Vou usar essa dica.

___________________________________
Conhecimento não se Leva para o Túmulo.

[2] Comentário enviado por mauricio123 em 22/07/2020 - 11:41h


Só vou mudar o nome para usbrestart.


___________________________________
Conhecimento não se Leva para o Túmulo.

[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B

[4] Comentário enviado por fabio em 22/07/2020 - 21:11h


[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B



De repente tu consegue fazer isso tratando a saída do comando usb-devices, vem a primeira linha que começa com Bus e a terceira linha que possui o Vendor.

Encontrou o Vendor desejado, basta montar o caminho do device com: /dev/bus/usb/0XX/0YY

onde XX e YY é o conteúdo de Bus e Prnt da primeira linha.


[5] Comentário enviado por mauricio123 em 22/07/2020 - 22:50h


[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B



seria uma boa. Mas que nem tá, não precisa melhor.

[6] Comentário enviado por mauricio123 em 02/08/2020 - 12:58h


Olha que interessante, hoje que eu fui verificar esse negócio e adivinha:

dpkg -S usbreset
usbutils: /usr/bin/usbreset

O meu já tinha e é muito eficiente.

___________________________________
Conhecimento não se Leva para o Túmulo.

[7] Comentário enviado por fabio em 03/08/2020 - 02:06h

Bacana! Aqui no Debian 10 não há esse pacote no repositório. A menos que esteja com outro nome.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts