Як я можу запустити сеанс екрана з командою над 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 Виділення псевдо-тти. Це можна використовувати для виконання arbi-
        тренуйте екранні програми на віддаленій машині, якими можуть бути
        дуже корисно, наприклад, при впровадженні меню меню. Множина -t
        параметри примушують розподілити tty, навіть якщо ssh не має локальних tty.

Я пробую те ж саме з tmux, ssh -t user@machine tmux attachі я можу приєднати віддалений сеанс tmux, але він змішується з кодуванням символів. Він відображає лише символи ascii. Чи є виправлення на це?
— Макаріо

1
@Macario Ви можете відкрити окреме питання для цього, хоча це дотично пов'язано, коли ви працюєте з ssh -t, але це схоже на те, що це пов'язано з налаштуванням LC_ * по-різному для інтерактивного запуску проти неінтерактивного. Коли ви передасте командний рядок в ssh для виконання, він буде виконуватися з неінтерактивним середовищем. Можливо також, що відсутність змінної середовища TERM, яка передається при виконанні неінтерактивно, у такому випадку tmux не має уявлення, якими можливостями насправді є ваш термінал, і повертається до найменшого загального знаменника.
— Kjetil Joergensen

Я не використовую 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.

1
Ваша відповідь була однаково хорошою, занадто поганою, яку я маю вибрати. Можливо, хтось повинен відредагувати першу відповідь та додати вашу інформацію.
— Томас Вандер Стіхеле

8

Пізня відповідь, але це те, що я роблю, я роблю псевдонім (назвемо це t), який робить це:

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

Це повідомляє sshпро відключення агента та переадресацію X11 і вказує screenприєднати до запущеного сеансу, запустити новий, якщо потрібно, використовувати ^Zяк команду прориву, використовувати UTF-8 та бути розумним щодо терміналу.

Все це означає, що я можу відкрити термінал, набрати, tі це відкриє моє сеанс екрана на $ MYSERVER. Потім я можу відкрити інший термінал, зробити те саме, і я отримаю ще одне вікно на той же сеанс.

Дуже приємно мати декілька вікон терміналів для одного і того ж сеансу екрану, щоб ви могли одночасно переглядати дві вкладки екрана.


1
Я прочитав досить багато сторінок, не зовсім відповідаючи на те, що я шукав, але ти прибив це. Я припускаю, що або екран, або 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я не бачу жодного екранного сеансу
— Тарун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.