ssh를 통해 원격 컴퓨터에서 로컬 bash 스크립트를 어떻게 실행합니까?


51

원격 컴퓨터에 아무것도 설치할 필요없이 하나의 중앙 컴퓨터에서 여러 원격 컴퓨터로 구성을 푸시하는 방법을 찾고 있습니다.

목표는와 같은 도구로 찾을 수 cfengine있지만 에이전트가 설정되지 않은 일련의 시스템에서 수행하는 것과 같은 작업을 수행하는 것입니다. 이것은 실제로 cfagent기존 원격 시스템 세트를 설정하는 좋은 기술 일 수 있습니다 .



1
P : 실제 질문은 SO에 중복 (55)가 23 upvotes있다
모조

답변:


55

스크립트를 전달하고 임시로 실행하여 쉘을 실행하여 임시로 실행할 수 있습니다.

예 :

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

당연히 "ls -l; echo 'Hello World'"부품은 로컬 시스템의 파일에 저장된 bash 스크립트로 대체 될 수 있습니다.

예 :

cat script.sh | ssh me@myserver /bin/bash

건배!


2
원격 시스템에서 sudo로 실행하려면 어떻게해야합니까. 예 : 원격 서버에 로그인 한 경우 보통 sudo -u testuser script.sh로 실행합니다.
Sharjeel

내가 호출하는 스크립트에 사용자 상호 작용이 포함되어 있으면 어떻게됩니까 ???
Abhimanyu Srivastava

20

여러 가지 방법이 있습니다.

1:

ssh user@remote_server 'bash -s' < localfile

2 :

cat localfile  | ssh user@remote_server

삼:

ssh user@remote_server "$(< localfile)"

숫자 3은 내가 선호하는 방식이며 대화식 명령을 허용합니다. su -S service nginx restart

(# 1은를 사용할 때 나머지 스크립트를 비밀번호 질문에 대한 입력으로 사용 su -S합니다.)


4
원격 컴퓨터에서 로컬 스크립트 실행에 관하여-변수를 원격 컴퓨터에 인수로 보내는 방법이 있습니까? 즉, 스크립트와 함께 변수 (여러 줄을 가짐)를 원격 컴퓨터에 인수로 보내려고합니다. 그런 다음 스크립트는 변수를 사용하려고합니다.

13

이 목적을 위해 python 's Fabric을 추천합니다.

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['host1', 'host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    sudo('./your_script.sh')

# from shell
$ fab deploy_script

시작하려면 위의 내용을 사용할 수 있어야합니다. 나머지 작업을 수행하려면 Fabric의 우수한 문서 를 참조하십시오 . 부록으로서 Fabric 내에서 스크립트를 완전히 작성할 수 있습니다. 복사 할 필요는 없지만 모든 머신에서 스크립트를 변경하려면 로컬 사본을 편집하고 재배치하기 만하면됩니다. 또한 API의 기본 사용법보다 약간만 사용하면 현재 실행중인 호스트 및 / 또는 다른 변수를 기반으로 스크립트를 수정할 수 있습니다. 그것은 일종의 pythonic Expect입니다.


나는 이것이 정확하게 질문에 대답한다고 생각하지 않지만 아이디어를 좋아하며 Fabric을 유용한 도구로 볼 수 있습니다.
tremoloqui

1
@tremoloqui Fabric은 ssh를 중심으로 한 파이썬 래퍼입니다. 대상 컴퓨터에 아무것도 설치할 필요가 없으며 푸시되는 스크립트를 저장하십시오. 일련의 패브릭 명령으로 다시 작성하면 ( run및 사용 sudo) 필요하지 않습니다.
이즈 카타

5

이것이 바로 Ansible이 사용되는 것입니다. 에이전트가 없으므로 다음과 같은 텍스트 파일을 작성하면됩니다.

/etc/ansible/hosts

다음과 같은 내용으로 표시됩니다.

[webhosts]
web[1-8]

이것은 "web1, web2 ... web8"머신이 "webhosts"그룹에 있음을 지정합니다. 그런 다음 다음과 같은 작업을 수행 할 수 있습니다.

ansible webhosts -m service -a "name=apache2 state=restarted" --sudo

sudo를 사용하여 모든 머신에서 apache2 서비스를 다시 시작하십시오.

다음과 같이 즉시 명령을 수행 할 수 있습니다.

ansible webhosts -m shell -a "df -h"

또는 원격 시스템에서 로컬 스크립트를 실행할 수 있습니다.

ansible webhosts -m script -a "./script.sh"

또는 서버가 다음을 준수하도록 배포하려는 전체 구성으로 플레이 북을 만들 수 있습니다 (자세한 내용은 설명서를 참조하십시오).

ansible-playbook webplaybook.yml

기본적으로 여러 서버에서 명령을 실행하기위한 명령 줄 도구로 사용하기 시작하고 적절하다고 생각되면 사용법을 완전한 구성 도구로 확장 할 수 있습니다.


3
나는 다음 사람만큼이나 ansible을 좋아하지만, 그가 스크립트에 대해 묻는다면 ansible에는 정말 멋진 스크립트 모듈이 있습니다 .ansible webhosts -m script script.sh
ptman

1
다른 모든 대답은 bash 스크립트와 관련이 있지만 그가 구체적으로 요구 한 것은 아닙니다. 그는 방금 구성을 원격 컴퓨터로 푸시한다고 말했습니다. 그러나 스크립트 모듈 : 좋은 언급
seumasmac

이 답변에 투표하십시오! 이것이 방법입니다!
병아리

@ptman 나는 단지 질문에 스크립트를 언급하지 않지만 제목에 대해서는 언급했습니다! 죄송합니다. 업데이트했습니다.
seumasmac

3

이 답변 에서 설명했듯이 heredoc 을 사용할 수 있습니다 .

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

텍스트를 보내지 만 응답을 기다리지 않기 때문에 heredoc에주의해야합니다. 즉, 명령이 실행될 때까지 기다리지 않습니다.


1

여기에 대한 답은 ( https://stackoverflow.com/a/2732991/4752883 사용하여 원격 리눅스 컴퓨터에서 스크립트를 실행하려고하는 경우) 좋은 작품 plink이나 ssh. 스크립트에 여러 줄이 있으면 작동합니다 linux.

** 그러나 로컬 linux/windows컴퓨터 에있는 배치 스크립트를 실행하려고 시도하고 원격 컴퓨터가 Windows이고 **를 사용하는 여러 줄로 구성된 경우

plink root@MachineB -m local_script.bat

작동하지 않습니다.

스크립트의 첫 번째 줄만 실행됩니다. 이것은 아마도 한계입니다 plink.

해결책 1 :

여러 줄 배치 스크립트를 실행하려면 (특히 비교적 간단한 경우 몇 줄로 구성) :

원래 배치 스크립트가 다음과 같은 경우

cd C:\Users\ipython_user\Desktop 
python filename.py

https://stackoverflow.com/a/8055390/4752883 : local_script.bat파일에서 다음과 같이 "&&"구분 기호를 사용하여 행을 결합 할 수 있습니다 .

cd C:\Users\ipython_user\Desktop && python filename.py

이 변경 후에는 @ JasonR.Coombs가 지적한대로 스크립트를 실행할 수 있습니다. https://stackoverflow.com/a/2732991/4752883

해결책 2 :

배치 스크립트가 비교적 복잡한 경우 여기에서 @Martin https://stackoverflow.com/a/32196999/4752883 에서 지적한 것처럼 plink 명령을 캡슐화하는 배치 스크립트를 사용하는 것이 좋습니다 .

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe

0

단순히 스크립트를 먼저 복사 한 다음 실행 해보십시오.

scp your_script.sh the_server:
ssh the_server "chmod +x your_script.sh; ./your_script.sh"

물론 세계에서 쓸 수있는 장소에 업로드하지 않도록주의해야합니다.


1
스크립트를 업로드하지 않으려는 이유는 스크립트를 관리 할 필요가없고 언급 한 위험이 있다는 것입니다. 또한 업로드, 처리 및 (선택적으로) 삭제하는 다단계 프로세스보다 간단합니다.
tremoloqui

0

각 명령에 이미 ssh 붙어 있고 호스트 이름 / ip 또는 그러한 목록이 인수로 스크립트에 전달 되는 방식으로 스크립트를 다시 작성하십시오 (암호 없음 / ssh- 에이전트 키 인증이 설정되어 있다고 가정). 원격 명령에서 오류 / 리턴 코드를 올바르게 전달하려면 일부 작업이 필요할 수 있습니다.


0

스크립트가 너무 크지 않고 bash 또는 ksh를 사용하는 경우 ...

ssh vm24 -t bash -c "$(printf "%q" "$(< shell-test.sh )")"

stdin과 stdout은 모두 올바르게 작동하지만 스크립트는 인수 크기 (일반적으로 약 100k)로 제한됩니다. 줄 끝에서 스크립트에 대한 인수가 추가 "-"인수 뒤에 올 수 있습니다. pty를 할당하기위한 "-t"는 선택 사항입니다.

조심하십시오 : 이것은 bash-completion을 혼란스럽게합니다. 탭을 누르지 마십시오.

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