Фальшивые USB-концентраторы в Linux

Con exec, está redirigiendo todos los resultados del script a un archivo de registro específico.

En su trampa, desea mostrar el contenido del archivo de registro usando cat. Dado que toda la salida también se redirige a ese archivo, GNU catnota que su archivo de entrada y el flujo de salida estándar (que se hereda del shell )son ​​lo mismo y se niega a realizar su tarea.

BSD catno realiza la misma comprobación que GNU cat, que, si no se interrumpe el script, da como resultado un archivo de registro infinitamente grande con las mismas pocas líneas repetidas una y otra vez.

Una solución es guardar el descriptor de archivo de salida estándar original, hacer la redirección como antes y luego restablecerlo en la captura.

#!/bin/bash

exec 3>&1                  # make fd 3 copy of original fd 1
exec >/tmp/error.log 2>&1

# in the trap, make fd 1 copy of fd 3 and close fd 3 (i.e. move fd 3 to fd 1)
trap 'exec 1>&3-; cat /tmp/error.log; curl "http://127.0.0.1/error.php?hostname=$(hostname)" -F file=@/tmp/error.log' EXIT

set -ex
wtfwtf

Esto hace una copia del descriptor de archivo 1 (como fd 3 )antes de redirigirlo al archivo de registro. En la trampa, volvemos a mover esta copia a fd 1 y hacemos la salida.

Tenga en cuenta que el flujo de error estándar, en la trampa, en este ejemplo, todavía está conectado al archivo de registro. Por lo tanto, si el curlgenera un mensaje de diagnóstico, este se guardará en el archivo de registro en lugar de mostrarse en el terminal (o donde se haya conectado el flujo de error estándar original ).


Teniendo en cuenta el comentario de Stéphane Chazelas :

#!/bin/sh

exit_handler () {
    # 1. Make standard output be the original standard error
    #    (by using fd 3, which is a copy of original fd 2)
    # 2. Do the same with standard error
    # 3. Close fd 3.
    exec >&3 2>&3 3>&-
    cat "$logfile"
    curl "some URL" -F "file=@$logfile"
}

logfile='/var/log/myscript.log'

# Truncate the logfile.
: >"$logfile"

# 1. Make fd 3 a copy of standard error (fd 2)
# 2. Redirect original standard output to the logfile (appending)
# 3. Redirect original standard error to the logfile (will also append)
exec 3>&2 >>"$logfile" 2>&1

# Use shell function for exit trap (for neatness)
trap exit_handler EXIT

set -ex
wtfwtf

Su punto es que el archivo de registro es solo para mensajes de diagnóstico de todos modos, por lo que tiene más sentido enviar el archivo de registro al flujo de error estándar original.

También señala que es peligroso usar un nombre de archivo fijo en un directorio de escritura mundial -como /tmp. Esto se debe a que no se realiza ninguna verificación en el script para asegurarse de que este archivo no existe (alguien o algún malware podría haber creado un enlace simbólico /tmp/error.loga /etc/passwdo a su ~/.bashrc, por ejemplo ).Su solución a esto es usar un archivo de registro persistente dedicado para la secuencia de comandos en /var/logen lugar de (el archivo es persistente, pero el contenido se borrará cuando se ejecute la secuencia de comandos ).

Una variación de esto sería usar mktemppara crear un nombre de archivo único bajo$TMPDIR(y luego eliminar ese archivo en la trampa EXIT, a menos que curlfalle, en cuyo caso el rmno sería ejecutado desde que set -eestá en vigor):

#!/bin/sh

exit_handler () {
    # 1. Make standard output be the original standard error
    #    (by using fd 3, which is a copy of original fd 2)
    # 2. Do the same with standard error
    # 3. Close fd 3.
    exec >&3 2>&3 3>&-
    cat "$logfile"
    curl "some URL" -F "file=@$logfile"
    rm -f "$logfile"
}

logfile=$( mktemp )

# 1. Make fd 3 a copy of standard error (fd 2)
# 2. Redirect original standard output to the logfile (appending)
# 3. Redirect original standard error to the logfile (will also append)
exec 3>&2 >>"$logfile" 2>&1

# Use shell function for exit trap (for neatness)
trap exit_handler EXIT

set -ex
wtfwtf

Su segundo ejemplo funciona, pero solo porque no está usando caten el archivo de registro, no por copiarlo.


Minuciosidad menor :Las URL en la línea de comando probablemente siempre deberían tener al menos comillas dobles -, ya que tienden a contener caracteres que el shell puede interpretar como especiales (, por ejemplo?).

1
03.04.2019, 20:13
1 ответ

В стандарте USB3 появился режим SuperSpeed ​​с новыми кабелями и разъемами. Ваша шина 4 поддерживает режим SuperSpeed, в котором используется совершенно другой набор проводов в кабелях USB. Так как режим с более высокой скоростью -физически отделен от старой проводки USB, имеет смысл, чтобы он вообще отображался как отдельная шина.

Остаются шины 1 и 2. Они в основном предназначены для простой установки Windows 7 с помощью USB-клавиатуры, мыши и/или установочного носителя:-)

Помните, что в Windows 7 (и во всех операционных системах до -USB3 )не было встроенных драйверов USB-контроллера XHCI -. Итак,в качестве функции обратной совместимости ваша система также имеет контроллеры EHCI USB2. Системная прошивка имеет возможность изначально запускать только контроллеры EHCI и подключать их к линиям USB 2 вместо контроллера XHCI. Это позволяет программам установки операционной системы запускаться и работать с использованием старых простых USB-драйверов EHCI для клавиатуры, мыши и USB-накопителей.

Когда соответствующий драйвер установлен и включает контроллер XHCI, существует -протокол ручной передачи, который также позволяет ему взять на себя управление портами на стороне USB2. В этот момент контроллер EHCI можно полностью отключить. Итак, ваши USB-шины 1 и 2 — это два дешевых -контроллера EHCI с обратной совместимостью, которые теперь передали свои соответствующие USB-порты новому блестящему контроллеру XHCI.

Обратите внимание, что два контроллера EHCI поддерживают только 2 порта каждый, и они подключены к отдельным объектам корневого концентратора, которые поддерживают 8 и 6 портов соответственно, что дает в общей сложности 14 портов USB2 -ровно столько же, сколько обрабатывается единственный корневой концентратор шины 3, которая является «медленной» стороной контроллера XHCI.

(Когда был представлен USB 2, существовало похожее решение проблемы обратной совместимости :старые контроллеры USB 1.1 UHCI/OHCI долгое время существовали как «компаньоны-контроллеры» вместе с контроллером USB 2.0 EHCI.. Но это решение не включало в себя -поверх протокола, поэтому два поколения USB-контроллеров довольно долго жили бок о бок -за -. В USB 3 разработчики спецификаций включили протокол hand over -, чтобы немного быстрее избавиться от устаревших контроллеров EHCI.)

2
28.04.2021, 23:35

Теги

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