Вопрос: Как запустить сеанс экрана с помощью команды поверх ssh на удаленном сервере с моего рабочего стола?


Я хочу, чтобы запускать сеансы экрана на удаленных серверах из одной команды ssh на моем рабочем столе. Однако на экране, похоже, нужен терминал, который недоступен при запуске команды через ssh.

Таким образом, очевидное

ssh root@my.machine screen "tail -f /var/log/messages"

(как пример) не работает, и дает

Must be connected to a terminal.

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


54
2018-06-08 10:57


Источник


В стороне, вы можете ударить эту ошибку не через плохое использование экрана. У меня была функция оболочки, которая выполняла exec <foo для чтения из файла. Много позже в большом сценарии я попытался запустить экран. Все методы ниже obv. как реальный виновник был exec. Нужно иметь в виду. Убедитесь, что вы не убили свой собственный stdin непреднамеренно. - Neil McGill


Ответы:


Попробуйте использовать параметр -t для ssh

ssh -t root@my.machine screen "tail -f /var/log/messages"

От человека ssh

-t Принудительное распределение псевдо-tty. Это можно использовать для выполнения arbi-
        trary на основе экрана на удаленной машине, которая может быть
        очень полезно, например, при реализации услуг меню. Несколько -t
        options force tty alloc, даже если ssh не имеет локального tty.

72
2018-06-08 11:04



Я пытаюсь сделать то же самое с tmux ssh -t user@machine tmux attach и я могу подключить удаленный сеанс tmux, но он вмешивается в кодировку символов. Он отображает только символы ascii. Это можно как-то исправить? - Macario
@Macario, вы можете открыть для него отдельный вопрос, в то время как он связан с тангенциально, поскольку вы запускаете его с помощью ssh -t, это похоже на то, что он связан с установкой LC_ * по-разному для интерактивного и неинтерактивного взаимодействия. Когда вы передаете команду ssh для выполнения, она будет выполнена с неинтерактивной средой. Также возможно отсутствие переменной среды TERM при выполнении неинтерактивно, и в этом случае tmux не имел бы представления о том, какие возможности имеет ваш терминал, и возвращается к наименее общему знаменателю. - Kjetil Joergensen
Я не использую ssh, но сталкиваюсь с той же проблемой. Пожалуйста помоги. serverfault.com/questions/861632/unable-to-run-code-in-screen - zhangjinzhou


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

ssh root@host screen -m -d "tail -f /var/log/messages"

Это запускает отдельный экран с командой, запущенной на нем.

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.

32
2018-06-08 14:08



Ваш ответ был одинаково хорошим, слишком плохим, что я должен был выбирать. Возможно, кто-то должен отредактировать первый ответ и добавить вашу информацию. - Thomas Vander Stichele


Поздний ответ, но это то, что я делаю, я делаю псевдоним (назовем его t), который делает это:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

Это говорит ssh отключить агент и переадресацию X11, а также сообщить screen для присоединения к запущенному сеансу, при необходимости запускайте новый, используйте ^Z как команда breakout, используйте UTF-8 и будьте умны относительно терминала.

Все это означает, что я могу открыть терминал, введите t и он откроет сеанс экрана на $ MYSERVER. Затем я могу открыть другой терминал, сделать то же самое, и я получаю другое окно для того же сеанса.

Очень приятно иметь несколько окон терминала на одном сеансе экрана, чтобы вы могли одновременно просматривать две вкладки экранов.


7
2017-09-12 20:48



Я прочитал довольно много страниц, не совсем отвечающих на то, что искал, но вы прибили его. Я предполагаю, что либо экран, либо tmux, вероятно, на большинстве серверов в наши дни, и те, с которыми я подключаюсь, являются потенциально эфемерными, поэтому я не хочу связываться с bashrc, как это предлагает большинство ответов. Вы также можете сделать это функцией в своей оболочке и принять аргументы, такие как $ host и $ command (которые вы бы поставили в конце). И вместо того, чтобы жестко кодировать ваш псевдоним t который является единственным хостом, вы можете объединить его с именами хостов в вашем ssh_config. - dragon788
@ dragon788 действительно, я сделал его функцией сейчас и заменил $ MYSERVER на «$ @». Я все еще пользуюсь этим. - w00t


Поместив следующее в файл ~ / .bashrc на моем сервере, он запускает сеанс экрана при первом входе в систему на сервере или, если он уже запущен, повторно соединяет меня с этим сеансом.

Мне это очень удобно:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

4
2018-06-08 14:21



Я пробовал это, но когда я это делаю screen -ls то я не вижу никакой сессии экрана - Tarun