Настройте сеанс экрана, чтобы он вел себя точно так же, как терминал xterm.

Я хочу иметь возможность настроить сеанс экрана через screenrc или внутри сеанса, чтобы он вел себя так же, как терминал xterm. В настоящее время у меня есть приложение С#, которое использует библиотеки ssh.net для подключения по ssh к ящику Linux с компьютера с Windows, где я подключаюсь к сеансу экрана, отправляю команды и получаю ответы обратно. Я вижу два разных типа и ответов для одной и той же команды, если я подключен к сеансу экрана, по сравнению с тем, когда я не подключен к сеансу экрана. Чтобы продемонстрировать проблему, я продублирую проблему, используя терминал шпатлевки, и зарегистрирую данные.

  1. Откройте терминал шпатлевки из окон
  2. Измените настройку Session->Logging и выберите SSH Packets, а также укажите место для сохранения файла putty.log.
  3. Установите свой IP-адрес и подключитесь к машине Linux
  4. После входа в систему введите следующую команду printf abc\6\n, эта строка содержит символ подтверждения
  5. ответ напечатает abc и, конечно, не покажет \6, так как это непечатаемый символ
  6. Откройте файл putty.log, и вы увидите, что данные пакетов ответов содержат \6, что является правильным поведением.
  7. Теперь создайте сеанс, введя следующую команду: screen -dmS test
  8. Присоединитесь к сеансу, введя следующую команду: screen -Rr test
  9. введите следующую команду еще раз printf abc\6\n
  10. abc будет напечатан, как и ожидалось, но если вы посмотрите на данные пакетов ответов в putty.log, в нем больше не будет символа \6
  11. Я могу решить эту проблему, введя команду, подобную этой: printf abc\6\n | cat -v для преобразования \6 в печатную форму и отображения ^F на экране, я бы предпочел получать \6 в данных своих пакетов, и это нежелательное решение, но, по крайней мере, оно обеспечивает решение моей проблемы.

Ниже приведена более серьезная проблема, которую я не смог решить. Для демонстрации сделайте следующее:

  1. Откройте терминал шпатлевки из окон
  2. Измените настройку Session->Logging и выберите SSH Packets, а также укажите место для сохранения файла putty.log.
  3. Установите свой IP-адрес и подключитесь к машине Linux
  4. После входа в систему измените настройку stty, введя следующую команду (указывает терминалу не заменять новую строку возвратом каретки): stty -onlcr
  5. затем введите команду ls -al,
  6. Файл putty.log будет содержать правильный набор данных без лишних символов.
  7. Теперь создайте сеанс, введя следующую команду: screen -dmS test
  8. Присоединитесь к сеансу, введя следующую команду: screen -Rr test
  9. введите следующую команду еще раз stty -onlcr
  10. введите ls -al снова
  11. если вы посмотрите на данные пакета ответа в putty.log, вы увидите, что после определенного количества полученных пакетов ответ будет содержать дополнительные символы перед каждым ответом. дополнительные символы имеют следующий формат [13C. числа между [ и C варьируются.

Я хотел бы, чтобы мои ответы вели себя так же, как стандартный терминал xterm. В чем разница и есть ли способ настроить экран для получения ответов, соответствующих типу терминала xterm.


person Dro    schedule 15.09.2020    source источник
comment
Возможно, этот вопрос лучше подходит для Linux&Unix или SuperUser сайты   -  person mnestorov    schedule 16.09.2020


Ответы (1)


Вы просите сделать что-то, что принципиально противоречит тому, что делает screen.

screen — это эмулятор терминала, как и xterm. Он интерпретирует поток данных от pty и отображает его внутри в буфере, чтобы отслеживать, что на экране, где и с каким форматированием.

Когда вы прикрепляете его, screen синтезирует новый поток инструкций терминала, чтобы перерисовать тот же самый буфер на вашем конкретном терминале.

Он не может просто хранить и воспроизводить один и тот же линейный поток, потому что это нарушило бы бесшовное мультиплексирование и повторное подключение (возможно, с разных терминалов), в чем и заключается суть инструмента.

Если вам нужен точный дамп линейного потока данных, поступающего на терминал, вы можете вместо этого использовать script.

person that other guy    schedule 15.09.2020
comment
Спасибо за ваш быстрый ответ. Если нам не нужно беспокоиться о подключении с разных терминалов, и мы предполагаем, что может подключаться один терминал или терминал одного типа, есть ли способ контролировать поведение потока исходящей буферизации экрана? После установки stty -onlcr я считаю, что дополнительные символы, которые мы получаем, являются позицией столбца каждого ответа [6C является 6-м столбцом, но я не могу понять, почему xterm не будет иметь эти дополнительные символы, даже если он печатает идентичный ответ на терминал и настройка stty установлены на stty -onlcr - person Dro; 15.09.2020
comment
Насколько я знаю, экран не поддерживает это, так как это не имеет отношения к его назначению. Вместо этого или в дополнение используйте другой инструмент. - person that other guy; 15.09.2020
comment
Моя цель - не иметь позиции столбца в восстановленных пакетах, когда они подключены к сеансу экрана. - person Dro; 15.09.2020
comment
Причина, по которой я использую экран, заключается в том, чтобы запускать приложение фонового командного процессора во время загрузки, а также подключать и отключать по требованию от внешнего приложения. запуск командного процессора позже вызывает некоторые проблемы с нашей RTOS и screen, и tmux показался хорошим решением для запуска приложений через rc.local и последующего подключения к ним. - person Dro; 15.09.2020
comment
Вы можете получить данные из script, как уже упоминалось, независимо от того, работает ли script в сеансе экрана. - person that other guy; 15.09.2020