Як я можу запустити сеанс екрана з командою над 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.