데스크탑의 원격 서버에서 ssh를 통해 명령으로 스크린 세션을 시작하려면 어떻게해야합니까?


57

데스크탑의 단일 ssh 명령으로 원격 서버에서 스크린 세션을 시작할 수 있기를 원합니다. 그러나 화면에는 ssh를 통해 명령을 실행할 때 사용할 수없는 터미널이 필요한 것 같습니다.

그래서 명백한

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

(예를 들어) 작동하지 않으며

Must be connected to a terminal.

ssh가 화면에서 명령을 실행하여 나중에 로그인하여 수동으로 시작한 화면 세션에 연결할 수 있도록하고 싶습니다.


옆으로, 화면을 잘못 사용하지 않아도이 오류가 발생할 수 있습니다. 파일에서 읽을 exec <foo를 수행하는 쉘 기능이 있습니다. 훨씬 나중에 큰 스크립트에서 화면을 시작하려고했습니다. 아래의 모든 방법은 obv. 실제 범인이 exec이므로 실패했습니다. 명심하십시오. 자신의 stdin을 실수로 죽이지 않았는지 확인하십시오.
— 닐 맥길

답변:


77

ssh에 -t 옵션을 사용해보십시오

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

남자 ssh에서

-t 의사 -tty 할당을 강제합니다. arbi-를 실행하는 데 사용할 수 있습니다
        원격 컴퓨터의 화면 기반 프로그램을 트래 리 할 수 ​​있습니다.
        메뉴 서비스를 구현할 때 매우 유용합니다. 다중 -t
        ssh에 로컬 tty가없는 경우에도 옵션은 tty 할당을 강제합니다.

tmux ssh -t user@machine tmux attach와 동일하게 시도하고 원격 tmux 세션을 연결할 수 있지만 문자 인코딩이 엉망입니다. ASCII 문자 만 표시합니다. 이것에 대한 해결책이 있습니까?
— Macario

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
당신의 대답은 똑같이 좋았고 너무 나도 선택해야했습니다. 누군가 첫 번째 답변을 수정하고 정보를 추가해야 할 수도 있습니다.
— Thomas Vander Stichele

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그때 나는 어떤 스크린 세션을 볼 수 없습니다
— Tarun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.