ssh를 사용하면 종료하지 않고 원격 시스템에서 명령을 어떻게 실행할 수 있습니까?


29

일반적으로 ssh에 명령을 전달하면

ssh me@example.com 'some-command.sh'

비 대화식 세션이 발생하며 명령 (또는 스크립트 등)이 실행되는 즉시 ssh가 종료됩니다. 대화식 세션을 얻는 방법과 로컬 컴퓨터에서 지정한 명령을 실행하는 방법 예를 들어, 화면을 열고 특정 화면 세션을 다시 시작하고 싶습니다.

ssh me@example.com 'screen -r 12345'

그러나 "터미널에 연결해야합니다"라는 오류가 발생하여 허용되지 않습니다. 내가 추정하는 것은 본질적으로 "대화식 쉘에서이 명령을 호출해야 함"을 의미합니다.

또 다른 예로서, 나는 종종 일을 할 권리를 갖기 위해 공유 계정을 사용해야하는 많은 기계를 사용합니다 (예 : 나름 : 나쁜 생각이지만 나를 비난하지 마십시오. 방법) 및 일반적으로 기본 쉘로 ksh가 있습니다. 로그인하고 bash (또는 zsh)로 전환하고 내 계정의 .bash_profile (또는 .zshrc)을 제공하고 싶습니다. 내가 대화 형 SSH 세션을 확립 할 수 있다면 이것은 쉬운 것입니다 로그인시 실행하는 원격 컴퓨터에 명령을 전달합니다.

나는 게시 할 것이라는 매우 끔찍한 (그리고 테스트되지 않은) 솔루션을 가지고 있지만 누군가가 더 나은 방법을 알고 있기를 바랍니다.

업데이트 : 이것을 깨닫지 못한 사람들을 위해, 나는이 모든 것을 손으로 할 계획이 없으므로 대화 형 세션을 열고 수동으로 수행한다고 말하면 실제로 아무것도 해결되지 않습니다.

두 번째 업데이트 : 명확히하기 위해 다시 시도하십시오 : 서버에서 (임의적으로 프로그래밍 된) 서버에서 (임의의) 명령을 실행하려고하지만 해당 프로그램 명령에 의해 영향을받는 대화 형 세션이 열려 있습니다.


echo "command" | ssh user@remote_host
laggingreflex

2
질문의 "종료하지 않고"부분을 놓치셨습니까? 명령이 완료된 후 종료 될 것이라고 확신합니다.
iconoclast

답변:


26

ssh를 실행할 때 다음 명령을 사용하여 bash를 시작하고 자신의 프로파일을 제공 할 수 있습니다.

ssh  -t hostname "bash --rcfile ~user/.bashrc"

4
+1. -t스위치와 질문자의 문제를 해결 screen뿐만 아니라.
패치

3
연결을 닫지 않고 임의의 명령과 함께 사용할 수 있습니까? 시도 ssh -t www.dev "echo 'hi there'"하면 명령이 실행 된 후 연결이 즉시 닫힙니다.
iconoclast

11

dogbane의 답변을 바탕으로 완벽한 솔루션은 다음과 같습니다.

ssh -t user@server 'cd /a/great/place; bash'

여기서는 -t대화식 쉘에 필요한 의사 터미널을 강제로 할당하는 데 사용합니다. 그런 다음 서버에서 두 가지 명령을 실행합니다. 먼저 대화 형 셸을 열기 전에 수행하려는 작업 (내 경우에는 디렉토리를 특정 폴더로 변경)과 대화 형 셸 자체. bash는 의사 터미널이 있고 대화식으로 응답한다는 것을 알았습니다.

작은 따옴표는 기본 쉘에서 실행할 명령으로 전체 항목이 원격 서버에 전달되도록합니다.

에 필요한 단서를 제공 한 dogbane에게 다시 감사드립니다 -t. 나는이 문제를 해결하는 데 사용했습니다 expect. 대포로 마우스를 죽이는 것입니다. (:


2

이 솔루션을 사용해보십시오.

echo "command" | ssh user@remote_host

로그인은 대화식이며 대화식 명령 행에 입력 한 것처럼 명령이 전달됩니다. 입력 한 것처럼 세션이 종료됩니다

ssh user@remote_host 'command'

3
명령이 완료된 후 세션이 종료되면 질문에 대답 하지 않습니다 . 명령의 요점은 명령이 실행 된 후 상호 작용하는 세션으로 남게 될 하지 단지를 통해 서버에 명령을 보내 ssh.
iconoclast

이것은 적어도 자신의 bash 파일을 사용하지 않고 명령이 실행 되는 상호 작용 을 시뮬레이션하는 데 좋습니다 -t. +1
laggingreflex

0

termIO cmd를 사용하려면 ssh -X를 사용하십시오.

또한- "ssh 'source ~ / .bashrc && cd && do'"와 같은 cmd를 연결할 수 있습니다.


그러나 전체 체인이 끝나면 대화식 세션이 남아 있지 않습니다. 여전히 닫힙니 까?
iconoclast

그리고 termIO 솔루션에 대해 자세히 설명 하시겠습니까?
iconoclast

0

원격 시스템에 detach 를 설치 하고 사용 하지 않는 이유 :

ssh -t user@example.com "/home/user/bin/detach ls"

이 'ls'를 실행하면 대화 형 세션으로 나를 떠나게됩니까? 'ls'대신에 'source .somefile'을 실행하여 별칭과 함수를 얻으면 어떻게됩니까? 대화식 세션에서 사용할 수 있습니까 아니면 다른 세션에서 실행 되었습니까?
iconoclast

아니, 때문에 detach, ls개방 세션을 유지하지 않고의 출력을 인쇄하지 않고 연결이 끊어집니다 ls하지만 여전히 실행하겠습니다.
Dan D.

서버에서 (임의로 프로그래밍 된) 서버에서 (임의의) 명령을 실행하려고하지만 프로그래밍 명령에 의해 수행되는 모든 작업에 영향을받는 대화 형 세션이 열려 있습니다. 따라서 내가 당신을 올바르게 이해하면 도움이되지 않습니다.
iconoclast

0

laggingreflex의 대답은 가깝습니다 ... 다음과 같이 변경합니다.

echo "command\n$(cat -)" | ssh user@remote_host

불행히도, "cat"이 stdout에 쓰는 행을 버퍼링하기 때문에 작동 방식이 마음에 들지 않을 것입니다 ... "echo-cat"이라는 스크립트를 다음과 같이 생성하면 :

{
  echo "${@}"
 #cat buffers & won't flush to stdout immediately
 #cat -
  IFS='\n'
  while read line
  do
        echo "${line}"
  done
}

버퍼링없이 동일한 결과를 얻을 수 있습니다.

echo-cat "command" | ssh user@remote_host

아마도 당신의 목표에 훨씬 더 가까이 갈 것입니다 ...


0

이것은 끔찍하고 테스트되지 않았지만 작동해야한다고 생각합니다.

user @ host 인수 뒤에 인용 된 인수를 사용하는 이름이 remote-starter 인 스크립트를 작성하십시오.

remote-starter user@example.com 'some-command.sh arg1 arg2'

이 스크립트는 먼저 인용 된 명령 (따옴표없이) .onetime을 원격 시스템의 파일 이름 (예 :)으로 저장 한 다음 일반 ssh 명령을 실행해야합니다. 이번에는 원격 시스템에서 실행할 명령을 전달하지 않습니다. (스크립트에서 ssh user@example.com을 실행하는 경우 exec ssh user@example.com을 실행하는 것이 좋습니다.)

이것이 작동하려면 원격 시스템은 .onetime.bash_profile 또는 .zshrc 등에서 소스 를 가져와야합니다. 실행 한 후에 .onetime는 삭제해야 .onetime하므로 다음에 일반 로그인을 수행 할 때 파일이 실행되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.