Можно ли получить доступ к открытому терминалу на компьютере через SSH?

Я ищу доступ к открытому терминалу, открытому локально на моем компьютере, с удаленного компьютера без использования tmux или screen. Есть несколько причин для этого, самым простым из которых является то, что я продолжаю приземляться с ситуацией, когда я не планировал вперед, запускал что-то большое на своем компьютере на работе, возвращался домой, а затем хотел проверить его через ssh.

По сути, я ищу способ подключиться к терминалу, уже запущенному на компьютере, и просмотреть его вывод.

Теперь я знаю, что есть несколько потоков, которые говорят, что вы не можете этого сделать (например, этот), а другие, которые просто рекомендуют screen и tmux (например, этот , этот один или этот). То, что я ищу, - это способ прямого доступа к запущенному терминальному процессу или, по крайней мере, увидеть кешированный вывод этого терминала. Я не обязательно должен иметь возможность вводить команды в этом терминале.

Есть ли способ сделать это? В противном случае, какие-либо идеи о взломе, которые могли бы работать? Я думал, что могу найти способ автоматически записывать stdout, stderr и команды в файл (возможно, умная настройка истории bash, которая регистрирует все?)

2
задан 28 July 2017 в 00:59

8 ответов

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

Несколько примеров, предполагая вы каким-то образом вычислили PID (идентификатор процесса) данного процесса (например, используя pidof или ps):

Если данный инструмент запускает подкоманды один за другим, проверьте, какой из них выполняется используя ps. Если данный инструмент иногда меняет рабочий каталог, проверьте его на /proc/<PID>/cwd. Если данный инструмент работает со многими файлами в строке, проверьте, какой из них открыт в /proc/<PID>/fd. Если вы не видите ни одного в данный момент, возможно, ваш процесс только что закрыл один и вот-вот откроет следующий; еще раз проверьте содержимое этого каталога. Если команда работает с одним огромным файлом с использованием стандартных read / write системных вызовов, вы можете найти номер дескриптора файла в /proc/<PID>/fd и проверить текущее смещение в соответствующем файле в /proc/<PID>/fdinfo. Если команда использует pread / pwrite вместо этого, см. Следующую маркерную точку. Вы можете подключиться к процессу, используя strace, чтобы посмотреть, что он делает: strace -p <PID>. Вскоре после этого выйдите с помощью Ctrl + C (он завершает только strace, а не приложение, которое вы трассируете). Изучите результат и найдите подходящий материал, который может дать вам представление. Используйте, например, параметр -e trace, чтобы ограничивать этот вывод только файловыми операциями. Вы увидите, например. имена файлов, которые открываются вашими приложениями, а также смещения, где выполняются операции pread / pwrite.
0
ответ дан 18 July 2018 в 09:32

Поскольку вы отметили этот гном-терминал, в зависимости от версии, возможно, будет возможно просмотреть часть вывода. Из этого сообщения в блоге, где автор хотел посмотреть, что делает терминал GNOME для «неограниченного» прокрутки:

Я мог бы просто посмотреть, какие файлы gnome-terminal были открыты, поэтому lsof на помощь. Затем я обнаружил, что это было подлый, у него было несколько файлов, называемых /tmp/vteXYZ1tv, но они уже удалили их. Таким образом, вы не можете видеть их при просмотре, и они будут удалены, когда программа закроется. [...] Они могут быть восстановлены, хотя мой путь (возможно, другие), должен был сделать ls -l /proc/<gnome-terminal pid>/fd, чтобы увидеть, на что они указывают. Затем вы можете cat создать новый файл. Это всего лишь стенографическая копия вывода терминала. Без сжатия. Нет, ничего.

Но в более новых версиях файлы должны быть зашифрованы. Из :

Я мог просто посмотреть, какие файлы gnome-terminal были открыты, поэтому lsof на помощь. Затем я обнаружил, что это было подлый, у него было несколько файлов, называемых /tmp/vteXYZ1tv, но они уже удалили их. Таким образом, вы не можете видеть их при просмотре, и они будут удалены, когда программа закроется. [...] Они могут быть восстановлены, хотя мой путь (возможно, другие), должен был сделать ls -l /proc/<gnome-terminal pid>/fd, чтобы увидеть, на что они указывают. Затем вы можете cat создать новый файл. Это всего лишь стенографическая копия вывода терминала. Без сжатия. Ничего.

vte-0.40 (который, скорее всего, появится в Ubuntu 15.10 W.W.), будет сжимать и шифровать эти файлы. Это сократит требуемое хранилище примерно на треть четвертой его размера (если ваше приложение создает X объем данных в виде обычного текста, где-то между X / 4 .. X / 3 - разумная оценка для хранилища, которая потребуется) , а также избавляется от проблемы конфиденциальности / безопасности в случае, если кто-то получает необработанный доступ к жесткому диску.

2
ответ дан 18 July 2018 в 09:32

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

Например, см. https://bugs.launchpad.net / ubuntu / + source / gnome-terminal / + bug / 1356433

Таким образом, пользователи в пределах одного сеанса X не могут повторно подключаться к закрытым вкладкам.

Вы можете попробовать reptyr, как было предложено muru , и это отличное решение, но лучше планировать свои сеансы ssh с самого начала.

Вам нужно разработать лучшую рабочую стратегию.

Использовать экран или tmux или аналогичный. Эти инструменты были разработаны именно для этого сценария.

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

Используйте экран или tmux или аналогичный. Эти инструменты были разработаны именно для этого сценария.

VNC over ssh - https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1356433

FreeNX - https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/

Вы можете использовать Xpra

https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/

http://xpra.org /

С помощью xpra вы можете начать, а затем снова подключить графический терминал, но снова вам нужно запустить xpra перед запуском терминала.

0
ответ дан 18 July 2018 в 09:32

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

Что можно сделать, это частично все TTY с помощью команды sudo cat /dev/vcs1. /dev/vcs[1-6] соответствуют соответствующим консолям TTY. Это ограничено размером буфера прокрутки соответствующего TTY, что означает, что вы можете видеть только то, что хранится в памяти, до определенного количества строк. Конечно, это может быть настроено на увеличение количества строк, как показано в ответе Муру. В качестве альтернативы вам, вероятно, следует попробовать

setterm -file log.txt -dump [ttynumbers]

, о котором упоминалось в ответе muru здесь .

В конце дня, bodhi.zazen правильно отметил в своем комментарии, что ваш отказ использовать screen или tmux является самой большой проблемой. Я полностью понимаю, я часто забываю отслеживать длительные программы самостоятельно, но с некоторыми командами вы должны начать думать заранее.

4
ответ дан 18 July 2018 в 09:32

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

Несколько примеров, предполагая вы каким-то образом вычислили PID (идентификатор процесса) данного процесса (например, используя pidof или ps):

Если данный инструмент запускает подкоманды один за другим, проверьте, какой из них выполняется используя ps. Если данный инструмент иногда меняет рабочий каталог, проверьте его на /proc/<PID>/cwd. Если данный инструмент работает со многими файлами в строке, проверьте, какой из них открыт в /proc/<PID>/fd. Если вы не видите ни одного в данный момент, возможно, ваш процесс только что закрыл один и вот-вот откроет следующий; еще раз проверьте содержимое этого каталога. Если команда работает с одним огромным файлом с использованием стандартных read / write системных вызовов, вы можете найти номер дескриптора файла в /proc/<PID>/fd и проверить текущее смещение в соответствующем файле в /proc/<PID>/fdinfo. Если команда использует pread / pwrite вместо этого, см. Следующую маркерную точку. Вы можете подключиться к процессу, используя strace, чтобы посмотреть, что он делает: strace -p <PID>. Вскоре после этого выйдите с помощью Ctrl + C (он завершает только strace, а не приложение, которое вы трассируете). Изучите результат и найдите подходящий материал, который может дать вам представление. Используйте, например, параметр -e trace, чтобы ограничивать этот вывод только файловыми операциями. Вы увидите, например. имена файлов, которые открываются вашими приложениями, а также смещения, где выполняются операции pread / pwrite.
0
ответ дан 24 July 2018 в 19:22

Поскольку вы отметили этот гном-терминал, в зависимости от версии, возможно, будет возможно просмотреть часть вывода. Из этого сообщения в блоге, где автор хотел посмотреть, что делает терминал GNOME для «неограниченного» прокрутки:

Я мог бы просто посмотреть, какие файлы gnome-terminal были открыты, поэтому lsof на помощь. Затем я обнаружил, что это было подлый, у него было несколько файлов, называемых /tmp/vteXYZ1tv, но они уже удалили их. Таким образом, вы не можете видеть их при просмотре, и они будут удалены, когда программа закроется. [...] Они могут быть восстановлены, хотя мой путь (возможно, другие), должен был сделать ls -l /proc/<gnome-terminal pid>/fd, чтобы увидеть, на что они указывают. Затем вы можете cat создать новый файл. Это всего лишь стенографическая копия вывода терминала. Без сжатия. Нет, ничего.

Но в более новых версиях файлы должны быть зашифрованы. Из :

Я мог просто посмотреть, какие файлы gnome-terminal были открыты, поэтому lsof на помощь. Затем я обнаружил, что это было подлый, у него было несколько файлов, называемых /tmp/vteXYZ1tv, но они уже удалили их. Таким образом, вы не можете видеть их при просмотре, и они будут удалены, когда программа закроется. [...] Они могут быть восстановлены, хотя мой путь (возможно, другие), должен был сделать ls -l /proc/<gnome-terminal pid>/fd, чтобы увидеть, на что они указывают. Затем вы можете cat создать новый файл. Это всего лишь стенографическая копия вывода терминала. Без сжатия. Ничего.

vte-0.40 (который, скорее всего, появится в Ubuntu 15.10 W.W.), будет сжимать и шифровать эти файлы. Это сократит требуемое хранилище примерно на треть четвертой его размера (если ваше приложение создает X объем данных в виде обычного текста, где-то между X / 4 .. X / 3 - разумная оценка для хранилища, которая потребуется) , а также избавляется от проблемы конфиденциальности / безопасности в случае, если кто-то получает необработанный доступ к жесткому диску.

2
ответ дан 24 July 2018 в 19:22

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

Например, см. https://bugs.launchpad.net / ubuntu / + source / gnome-terminal / + bug / 1356433

Таким образом, пользователи в пределах одного сеанса X не могут повторно подключаться к закрытым вкладкам.

Вы можете попробовать reptyr, как было предложено muru , и это отличное решение, но лучше планировать свои сеансы ssh с самого начала.

Вам нужно разработать лучшую рабочую стратегию.

Использовать экран или tmux или аналогичный. Эти инструменты были разработаны именно для этого сценария.

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

Используйте экран или tmux или аналогичный. Эти инструменты были разработаны именно для этого сценария.

VNC over ssh - https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1356433

FreeNX - https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/

Вы можете использовать Xpra

https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/

http://xpra.org /

С помощью xpra вы можете начать, а затем снова подключить графический терминал, но снова вам нужно запустить xpra перед запуском терминала.

0
ответ дан 24 July 2018 в 19:22
  • 1
    Да, VNC, экран, tmux - все это хорошие решения с небольшой предусмотрительностью. Однако эта ошибка не подразумевает, что содержимое терминала невозможно получить доступ - это просто означает, что управление вкладкой в ​​терминале gnome, пожалуй, немного затруднительно. Несмотря на это, я действительно согласен с вашей точкой зрения о лучшей рабочей стратегии, и я изучал различные варианты этого. Я не уверен, куда идти, но я склоняюсь к началу сеанса экрана при запуске и с помощью команды .bashrc для присоединения к сеансу с каждым новым терминалом. – ck4e 28 July 2017 в 23:08
  • 2
    Думаю, я бы предпочел рекомендовать X2go, чем FreeNX. – Jo-Erlend Schinstad 28 July 2017 в 23:46

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

Что можно сделать, это частично все TTY с помощью команды sudo cat /dev/vcs1. /dev/vcs[1-6] соответствуют соответствующим консолям TTY. Это ограничено размером буфера прокрутки соответствующего TTY, что означает, что вы можете видеть только то, что хранится в памяти, до определенного количества строк. Конечно, это может быть настроено на увеличение количества строк, как показано в ответе Муру. В качестве альтернативы вам, вероятно, следует попробовать

setterm -file log.txt -dump [ttynumbers]

, о котором упоминалось в ответе muru здесь .

В конце дня, bodhi.zazen правильно отметил в своем комментарии, что ваш отказ использовать screen или tmux является самой большой проблемой. Я полностью понимаю, я часто забываю отслеживать длительные программы самостоятельно, но с некоторыми командами вы должны начать думать заранее.

4
ответ дан 24 July 2018 в 19:22
  • 1
    Большое вам спасибо за ваш ответ. Я пробовал как cat /dev/vcs1, так и setterm с ограниченными результатами, но, конечно, лучше, чем раньше. Опять же, я бы предостерег от того, чтобы назвать это отказом - я признаю, что могу использовать его, а иногда и делать. Мой вопрос был больше того, какие варианты доступны мне, если я не инициировал экран или tmux. Я взглянул на скрипт, и один из моих вариантов на данный момент состоит в том, чтобы добавить простую функцию в мой .bashrc, чтобы инициировать ведение журнала общего вывода терминалов в каком-то файле журнала. Однако общее решение остается интересным. – ck4e 28 July 2017 в 22:21
  • 2
    Я мог бы, конечно, добавить команду screen в мой .bashrc - возможно, что-то вдоль этих строк . Я понимаю, что такое решение не является идеальным, и меня будут интересовать другие варианты. Это, конечно, не общее и не разрешит общую проблему, если не началось screen или tmux – ck4e 28 July 2017 в 22:24

Другие вопросы по тегам:

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