[shell] SSH를 사용하여 원격 시스템에서 쉘 스크립트를 실행하는 방법은 무엇입니까?

원격 컴퓨터에서 쉘 스크립트 (windows / Linux)를 실행해야합니다.

머신 A와 B 모두에 SSH가 구성되어 있습니다. 스크립트는 머신 A에 있으며 원격 머신 머신 B에서 일부 코드를 실행합니다.

로컬 및 원격 컴퓨터는 Windows 또는 Unix 기반 시스템 일 수 있습니다.

plink / ssh를 사용하여 실행할 수있는 방법이 있습니까?



답변

기계 A가 Windows 상자 인 경우, -m 매개 변수와 함께 Plink ( PuTTY의 일부)를 사용할 수 있으며 원격 서버에서 로컬 스크립트를 실행합니다.

plink root@MachineB -m local_script.sh

머신 A가 유닉스 기반 시스템 인 경우 다음을 사용할 수 있습니다.

ssh root@MachineB 'bash -s' < local_script.sh

스크립트를 실행하기 위해 스크립트를 원격 서버에 복사 할 필요는 없습니다.


답변

이것은 오래된 질문이며 Jason의 대답은 잘 작동하지만 이것을 추가하고 싶습니다.

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

su 및 사용자 입력이 필요한 명령과 함께 사용할 수도 있습니다. ( '탈출 된 heredoc 참고 )

편집 :이 답변은 약간의 트래픽을 계속 받고 있기 때문에 heredoc의 멋진 사용법에 더 많은 정보를 추가 할 것입니다.

이 구문으로 명령을 중첩 할 수 있으며 중첩이 작동하는 유일한 방법은 (정상적인 방법으로)

ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

실제로 telnet, ftp 등과 같은 일부 서비스와 대화를 할 수 있습니다. 그러나 heredoc은 stdin을 텍스트로 보내므로 줄 사이의 응답을 기다리지 않습니다.

편집 : 방금 을 사용하면 내부를 들여 쓸 수 있음을 알았습니다 <<-END!

ssh user@host <<-'ENDSSH'
    #commands to run on remote host
    ssh user@host2 <<-'END2'
        # Another bunch of commands on another host
        wall <<-'ENDWALL'
            Error: Out of cheese
        ENDWALL
        ftp ftp.secureftp-test.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(이것이 효과가 있다고 생각합니다)

http://tldp.org/LDP/abs/html/here-docs.html 참조


답변

또한 대상 호스트에서 변수를 선택하려면 이스케이프하는 것을 잊지 마십시오.

이것은 과거에 나를 잡아 냈습니다.

예를 들면 다음과 같습니다.

user@host> ssh user2@host2 "echo \$HOME"

/ home / user2를 출력합니다

동안

user@host> ssh user2@host2 "echo $HOME"

/ home / user를 출력합니다

또 다른 예:

user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"

“hello”를 올바르게 인쇄합니다.


답변

이것은 인라인 원격 명령과 로컬 시스템에서 원격 호스트로 ENV 변수를 전달하여 원격 측에서 스크립트를 매개 변수화 할 수있는 YarekT의 답변을 확장 한 것입니다.

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

이 스크립트는 모두 하나의 스크립트로 작성하여 매우 읽기 쉽고 유지 관리가 가능하므로 매우 유용합니다.

왜 이것이 효과가 있습니까? ssh는 다음 구문을 지원합니다.

ssh user @ host remote_command

bash에서는 다음과 같이 한 줄에서 명령을 실행하기 전에 정의 할 환경 변수를 지정할 수 있습니다.

ENV_VAR_1 = ‘value1’ENV_VAR_2 = ‘value2’bash -c ‘echo $ ENV_VAR_1 $ ENV_VAR_2’

따라서 명령을 실행하기 전에 변수를 쉽게 정의 할 수 있습니다. 이 경우 echo는 우리가 실행하는 명령입니다. echo 전의 모든 것은 환경 변수를 정의합니다.

그래서 우리는 두 가지 기능과 YarekT의 대답을 결합하여 얻었습니다.

ssh user @ host ARG1 = $ ARG1 ARG2 = $ ARG2 ‘bash -s'<< ‘ENDSSH’…

이 경우 ARG1 및 ARG2를 로컬 값으로 설정합니다. user @ host 이후에 remote_command로 모든 것을 보냅니다. 원격 시스템에서 ARG1 및 ARG2 명령이 실행될 때 원격 서버의 환경 변수를 정의하는 로컬 명령 행 평가 덕분에 로컬 값이 설정되고 해당 변수를 사용하여 bash -s 명령이 실행됩니다. 짜잔


답변

<hostA_shell_prompt>$ ssh user@hostB "ls -la"

hostA 사용자의 공개 키를 user .ssh 디렉토리의 홈에있는 authorized_keys 파일에 복사하지 않은 경우 비밀번호를 묻는 메시지가 표시됩니다. 이를 통해 비밀번호없는 인증이 가능합니다 (ssh 서버 구성에서 인증 방법으로 승인 된 경우).


답변

보다 정교한 작업을 위해 Fabric 을 사용하기 시작했습니다 . Fabric에는 Python과 몇 가지 다른 종속성이 필요하지만 클라이언트 시스템에만 필요합니다. 서버는 ssh 서버이면됩니다. 이 도구는 SSH로 전달한 쉘 스크립트보다 훨씬 강력하며 설정에 어려움이 있습니다 (특히 Python에서 프로그래밍을 즐기는 경우). Fabric은 여러 호스트 (또는 특정 역할의 호스트)에서 스크립트 실행을 처리하고, 구성 스크립트에 줄을 추가하는 등의 dem 등식 작업을 용이하게하는데 도움을줍니다. 언어는 제공 할 수 있습니다).


답변

실행 해보십시오 ssh user@remote sh ./script.unx.