Как я могу запустить сеанс экрана командой ssh ​​на удаленном сервере с моего рабочего стола?

57

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

Итак, очевидное

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

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

Must be connected to a terminal.

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

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

Ответы:

77

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

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

От человека сш

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

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

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.
Alakdae
источник
1
Ваш ответ был одинаково хорош, слишком плохо, я должен выбрать. Может быть, кто-то должен отредактировать первый ответ и добавить вашу информацию.
Томас Вандер Стичеле
8

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

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

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

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

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

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

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

Я нахожу это очень удобным:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi
казарка
источник
Я попробовал это, но когда я это делаю, screen -lsя не вижу ни одного сеанса экрана
Тарун