전체 로그인 쉘로 원격 ssh 명령 실행


48

ssh example.com 'ls'그러나 ssh 맨 페이지 당 다음과 같은 작업을 수행하고 싶습니다 .

경우 명령이 지정되어, 그 대신 로그인 쉘의 원격 호스트에서 실행됩니다.

ls결과는 출력 을 표시 한 다음 ssh가 종료됩니다.

내가 알 수없는 것은 전체 로그인 셸을 연 다음 해당 셸 내에서 명령을 실행하는 방법입니다. 명령이 실행 된 후 쉘을 열어 두십시오. 마치 수동으로 다음을 수행 한 것처럼 :

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

어떤 아이디어?


이것은 비슷한 질문 superuser.com/questions/261617/…입니다. 그러나 실제로 내가하려는 일에 맞는 답변은 없습니다.
matthew

어때요 ssh example.com 'ls;bash'?
Andrejs Cainikovs

두 번째 쉘을 대화식으로 만들려면 내 시스템에 -i가 필요합니다.
Flexo

옵션 -t는 질문에 대한 답변입니다. 다른 옵션 (예 : 키 체인)이 있지만 실제 요구 사항에 따라 달라집니다.
hornetbzz

@hornetbzz -t는 pseudo-tty를 제공합니다. 그러나 그렇지 않으면 동작은 같습니다. 대화 형 셸을 시작하고 해당 셸 내에서 명령을 실행하고 명령이 실행 된 후에 셸을 열어 둡니다.
matthew

답변:


40

bash에게 ls로그인 쉘에서 실행 한 다음 실행하도록 지시하십시오.

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
불행히도을 사용하는 동안 작동하지 않는 것 같습니다 screen. 그렇지 않으면 이것은 내가하려는 일을하는 것처럼 보입니다.
matthew

31
ssh user@host -t 'ls; exec $SHELL -l'

-t의사 터미널 할당을 강제합니다. 원격 컴퓨터에서 임의의 화면 기반 프로그램을 실행하는 데 사용할 수 있습니다. 보다 약간 더 적합합니다 bash -i.

exec 새로운 프로세스가 생성되지 않습니다.

-l~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을 순서대로 찾고 명령을 읽고 실행합니다.이 명령을 사용하지 않으면 ~ / bin 디렉토리에서 스크립트 / 명령을 실행할 수 없습니다. ~ / .profile부터는 -l플래그 없이 실행되지 않습니다 .

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan 해결 방법으로 작동 할 수 있지만 명령을 실행 한 후에 새 쉘을 열지 않고 셸 내에서 명령을 실행하고 싶습니다.
matthew

+1, -t는 확실히 -i를 넘어가는 올바른 방법입니다.
Flexo

@matthew : 그것을 bash허용하기 위해 스스로 패치해야 합니다.
grawity

@grawity는 실제로 내 대답을 참조하십시오
fons

@matthew, 사용 exec bash또는exec $SHELL
Eugen Konkov

1

fons의 답변에 대한 귀하의 의견에서을 사용하는 동안 작동하지 않는다고 말합니다 screen.

그것에 대해 자세히 설명해 주시겠습니까? openssh의 소스 코드를 보면 sshd는 다음을 호출하여 명령을 실행합니다.

YOUR_DEFAULT_SHELL -c COMMAND

기본 쉘은 경우에 따라서, 예를 들어 screen, 다음이 아니라 때문에 모든 작동하지 않습니다 screen'의 -c플래그가 바로 그것보다 우선을 .scrreenrc. 따라서 기본 쉘 인 경우 화면에 명령을 보낼 수있는 방법이 없습니다. 실제로 ssh에 제공된 명령으로 screen을 실행해야하지만 screen이 아닌 기본 쉘을 사용해야 합니다.

그것이 당신이하려고하는 일이라면, screen비 대화 형 프로그램으로 창을 닫을 것이기 때문에 일이 정말로 이상하게 될 것이라고 생각 합니다. 따라서 폰과 비슷한 트릭을 수행해야하지만 한 단계 더 깊이 있어야합니다. SO, 예 / 빈 / bash에와 (그리고 화면) 기본 쉘과 같은 식으로 뭔가 :

ssh user@host -t 'screen bash -l -c "ls;bash"'

심호흡을해야하는 것은 호스트에 ssh를 넣고 screen 명령으로 bash -c를 실행하면 새로운 창이 나타납니다. 이 창이 방금 ls를 열면 종료되고 화면이 종료되므로 새 화면 창 안에 fons의 트릭을 사용 합니다.

그것이 당신이하려는 일조차도 그것이 효과가 있다고 생각합니다.)


screen이 상황에서 내가 가진 문제 는 일반적으로 exec screen -RR내에서 로드하는 것입니다 .profile. 이것은 bash -l나머지 화면을 버리는 화면을로드하려고 한다는 것을 의미 합니다. 귀하와 @fons 솔루션 모두에서 '-l'을 제거하면 문제를 해결할 수있는 것 같습니다 (그러면 나를 떠납니다 screen). 그래도 별나다.
matthew

0

ssh에 로컬 tty가없는 경우에도 여러 개의 -t 옵션이 tty 할당을 강제합니다.

ssh -tt user@host 'bash -l -c "/path/to/command'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.