синтаксическая ошибка в операторе case после сеанса ssh

Хм. Если я что-то не упустил, похоже, что контроллер инициализируется дважды:

[    5.195136] xhci_hcd 0000:05:00.0: xHCI Host Controller
[    5.195145] xhci_hcd 0000:05:00.0: new USB bus registered, assigned bus number 3
[    5.202621] xhci_hcd 0000:05:00.0: hcc params 0x014051cf hci version 0x100 quirks 0x00000090
....
[    5.203568] xhci_hcd 0000:05:00.0: xHCI Host Controller
[    5.203572] xhci_hcd 0000:05:00.0: new USB bus registered, assigned bus number 4
[    5.204014] usb usb4: We don't know the algorithms for LPM for this host, disabling LPM.

В Информации о продукте Renesas говорится, что, несмотря на наличие двух портов для каждого устаревшего корневого концентратора USB 3.0/USB 2.0, существует только один корневой концентратор, поэтому я не понимаю, что происходит.

Если два экземпляра xhci_hcdпытаются управлять картой одновременно, то, конечно, это пойдет не так.

Следующее, что я должен сделать, это просмотреть исходный код xhci_hcdи перекомпилировать его с поддержкой отладки. Для этого требуется опыт программирования, поэтому, если вы не знаете, как это сделать, в качестве альтернативы отправьте отчет об ошибке для любого средства отслеживания ошибок ядра xhci_hcd, даже если разработчики просто скажут вам, что я глуп, а повторная инициализация — это нормально.

Редактировать

При просмотре отладочных сообщений это выглядит очень странно:

[    2.423207] xhci_hcd 0000:05:00.0: Finished xhci_run for USB2 roothub
[    2.423420] xhci_hcd 0000:05:00.0: Endpoint 0x81 ep reset callback called
[    2.423547] xhci_hcd 0000:05:00.0: set port power, actual port 0 status  = 0x2a0
[    2.423563] xhci_hcd 0000:05:00.0: set port power, actual port 1 status  = 0x2a0
[    2.423613] xhci_hcd 0000:05:00.0: xHCI Host Controller
[    2.423616] xhci_hcd 0000:05:00.0: new USB bus registered, assigned bus number 2
[    2.423621] xhci_hcd 0000:05:00.0: // Turn on HC, cmd = 0x5.
[    2.426468] xhci_hcd 0000:05:00.0: Finished xhci_run for USB3 roothub
[    2.426630] xhci_hcd 0000:05:00.0: Endpoint 0x81 ep reset callback called
[    2.426798] xhci_hcd 0000:05:00.0: set port power, actual port 0 status  = 0x2a0
[    2.426819] xhci_hcd 0000:05:00.0: set port power, actual port 1 status  = 0x2a0
[    2.426893] xhci_hcd 0000:05:00.0: remove, state 1
[    2.427674] xhci_hcd 0000:05:00.0: USB bus 2 deregistered
[    2.427731] xhci_hcd 0000:05:00.0: remove, state 1

Итак, после инициализации всего и на USB 2.0, и на корневом концентраторе USB 3.0 вызывается сброс. Они удаляются, а затем драйвер снова пытается инициализировать все это (, что является второй инициализацией, которую я видел ). Только на этот раз сильно не получается.

В исходном коде ядра функция xhci_endpoint_resetимеет комментарии вроде «Возможно, нам потребуется реализовать config ep cmd в xhci 4.8.1» и «Пока просто напечатайте отладку, чтобы следить за ситуацией».

Так что это определенно дело разработчиков ядра. Обязательно дополните отчет об ошибке выводом отладки.

1
23.12.2020, 10:05
2 ответа

Проблема в том, что вы смешиваете то, для чего используете стандартный ввод, предоставляя программу для выполнения на удаленной машине и ввод для этой программы.

Как написано, происходит следующее.

  • удаленная оболочка читает echo -e "Enter the case you want to echo\n 1.1 a \n 2.1 b"со стандартного ввода и выполняет эхо.
  • удаленная оболочка читает read optionсо стандартного ввода и выполняет чтение.
  • readсчитывает case "\$option" inсо стандартного ввода и устанавливает для этого параметра опцию.
  • Удаленная оболочка получает 1)из стандартного ввода и выдает синтаксическую ошибку.
7
18.03.2021, 22:41

Здесь, в дополнение к ответу @icarus, вы можете написать это:

#!/bin/sh -

if [ "$#" -eq 0 ]; then
  printf >&2 'Enter the raspberry ip address you want to connect to: '
  IFS= read -r ip
  set -- "$ip"
fi

for ip do
  printf >&2 '%s\n' "Connecting to $ip"
  SSHPASS=the@Donut sshpass -e \
    ssh -oStrictHostKeyChecking=no "pi@$ip" "$(cat << 'EOF'

    printf >&2 '%s\n' 'Enter the case you want to echo' \
                      ' 1.1 a' \
                      ' 2.1 b'
    IFS= read -r option
    case "$option" in
      (1) echo a;;
      (2) echo b;;
    esac
EOF
)"
done

То есть:

  • избегатьecho(echo -n/ echo -eне являются стандартным синтаксисом sh+utilities)
  • избегайте readобработки сообщения -по умолчанию и считывайте строку ввода в необработанном виде.
  • позволяет пользователю передавать имя хоста (с )в качестве аргумента, что облегчает автоматизацию сценариев.
  • выдавать подсказки и другие вещи, которые не являются фактическим выводом сценария на stderr (снова, чтобы его можно было автоматизировать, и вы могли делать такие вещи, как actual_output=$(that-script), например ).
  • Избегайте передачи пароля в командной строке, так как это общедоступно. Поскольку этот скрипт содержит конфиденциальную информацию, вы захотите ужесточить права доступа к нему, чтобы пароль был виден только тем пользователям, которым нужен доступ к нему.
  • сценарий передается в качестве аргумента sshвместо стандартного ввода, так что скрипт по-прежнему может запрашивать пользователя через стандартный ввод.
  • это делается путем захвата вывода cat, который передается здесь -документу, чей терминатор(EOF)указан в кавычках, поэтому в этом документе не выполняется расширение.
  • здесь удалена ненужная переадресация X11, так как здесь нет команды, которая должна подключаться к X-серверу.
  • также удалил псевдотерминал -tty, так как в этом скрипте он не требуется.
  • добавил несколько недостающих кавычек.

Вышеприведенное предполагает, что оболочка входа пользователя piв $ipпохожа на POSIX -sh -.

2
18.03.2021, 22:41

Теги

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