Как я сбрасываю USB-устройство с помощью сценария?

Вы изменяли что-нибудь в своем .zshrc файле? Поскольку, когда я делаю

ssh 127<tab>

это дает мне корректные предложения... курсор идет в правильном месте:

ssh 127.0.<cursor>.1
127.0.0.1 127.0.1.1

(вторая строка является предложениями, добираются),

4
23.08.2016, 11:29
2 ответа

Я думаю, что вы в основном там:

#!/bin/sh

for X in /sys/bus/usb/devices/*
do
    if [ -e "$X/idVendor" ] && [ -e "$X/idProduct" ] \
           && [ 12d1 = $(cat "$X/idVendor") ] && [ 1446 = $(cat "$X/idProduct") ]
    then
        echo 0 >"$X/authorized"
        # might need a small sleep here
        echo 1 >"$X/authorized"
    fi
done

Это перебирает все устройства (как и вы), и каждый раз, когда он находит соответствие идентификаторам vendor: product, он применяет сброс, который работает для тебя.


Кроме того, вы можете изучить программу watchdog в качестве альтернативы вашей работе cron .

0
27.01.2020, 21:05

Если вы планируете использовать командную строку, а затем сбросить ее.

Сохраните следующее как usbreset.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;
}

Запустите следующие команды в терминале:

Скомпилируйте программу:

$ cc usbreset.c -o usbreset Get the Bus and Device ID of the USB device you want to reset:

$ lsusb
Bus 002 Device 003: ID 0fe9:9010 DVICO
Make our compiled program executable:

$ chmod +x usbreset Execute the program with sudo privilege; make necessary substitution for <Bus> and <Device> ids as found by running the lsusb command:

$ sudo./usbreset /dev/bus/usb/002/003

Другое

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl
driver = sys.argv[-1]
print "resetting driver:", driver
USBDEVFS_RESET= 21780

try:
    lsusb_out = Popen("lsusb | grep -i %s"%driver, shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().split()
    bus = lsusb_out[1]
    device = lsusb_out[3][:-1]
    f = open("/dev/bus/usb/%s/%s"%(bus, device), 'w', os.O_WRONLY)
    fcntl.ioctl(f, USBDEVFS_RESET, 0)
except Exception, msg:
    print "failed to reset device:", msg

В моем случае это был драйвер cp210x (, о котором я узнал из lsmod | grep usbserial ), чтобы вы могли сохранить приведенный выше фрагмент как reset _usb.py, а затем сделать это:

sudo python reset_usb.py cp210x

Это также может быть полезно, если в вашей системе еще нет установленного компилятора c, но у вас есть python.

Полезный ответ Официальный raspberry pi

0
27.01.2020, 21:05

Теги

Похожие вопросы