데스크탑의 원격 서버에서 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.