Использование / в качестве разделительного символа для команды sed
s
не является обязательным. Разделителем является первый символ после s. Вы можете использовать |
или #
или (почти) все, что вам нравится. Для вещей с большим количеством символов /
, таких как пути к именам файлов, мне нравится использовать запятые, потому что они идут под базовой линией и поэтому их легче увидеть, а в именах файлов они встречаются очень редко:
sed 's,^/home/me/subdir/,^/home/he/otherdir/,'
Выберите символ, который вы не найдете при поиске и замене. Если у вас есть один или два, добавьте к ним обратную косую черту.
В то время как, как сказал ОП, некоторые USB-концентраторы имеют дополнительный протокол, позволяющий отключать питание одного порта, что легко решает проблему с использованием uhubctl, большинство USB-концентраторов, включая внутренние, имеют нет такого контроля.
Что все еще возможно в Linux, так это попросить ядро отключить использование USB-устройства, записав 0 в управляющий файл authorized
этого устройства в дереве /sys/bus/usb/devices
. Для устройства, которое ведет себя нормально, это решило бы проблему, но не для устройства, которое все время отключается и снова подключается.
Тем не менее, когда любой USB-концентратор отключен таким образом, он отключит и отключит питание всех своих портов. Таким образом, отключение USB-концентратора, к которому подключено устройство, эффективно отключит и отключит неправильное устройство. Если потеря любого другого устройства, подключенного к этому концентратору, приемлема, то это возможный метод.
Обратная запись 1
в файл authorized
снова включит устройство, а для концентратора снова подаст питание на его порты, вернув питание любому подключенному устройству.
Пример:
# cat /sys/bus/usb/devices/2-1/product
USB2.0 Hub
# echo 0 > /sys/bus/usb/devices/2-1/authorized
# dmesg|tail -1
[226616.900051] usb 2-1.3: USB disconnect, device number 30
usb 2-1.3
была клавиатура, и ее светодиоды погасли.
# echo 1 > /sys/bus/usb/devices/2-1/authorized
# dmesg|fgrep 2-1|tail -10
[227055.203089] hub 2-1:1.0: USB hub found
[227055.204441] hub 2-1:1.0: 4 ports detected
[227055.213891] usb 2-1: authorized to connect
[227055.405342] usb 2-1.3: new low-speed USB device number 41 using xhci_hcd
[227055.511969] usb 2-1.3: New USB device found, idVendor=413c, idProduct=2113, bcdDevice= 1.08
[227055.511975] usb 2-1.3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[227055.511978] usb 2-1.3: Product: Dell KB216 Wired Keyboard
[227055.520754] input: Dell KB216 Wired Keyboard as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.3/2-1.3:1.0/0003:413C:2113.001A/input/input136
[227055.583032] input: Dell KB216 Wired Keyboard System Control as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:413C:2113.001B/input/input137
[227055.641748] input: Dell KB216 Wired Keyboard Consumer Control as /devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.3/2-1.3:1.1/0003:413C:2113.001B/input/input138
Предполагая, что вы используете systemd (или достаточно стандартный дистрибутив Linux ), я думаю, что эта инициализация USB, вероятно, выполняется udev во время процесса загрузки. Эта ссылка объясняет, как udev загружает и инициализирует устройства на основе файлов правил, которые хранятся в /lib/udev/rules.d
и /etc/udev/rules.d
.
Один из этих файлов правил должен относиться к USB-устройствам. Я не могу предоставить точную информацию, но я думаю, что должна быть возможность изменить правила USB, чтобы исключить это конкретное устройство на основе его пути к устройству или другого соответствующего свойства. Возможно, вам придется покопаться и попробовать несколько вещей.