ssh를 통해 원격 컴퓨터에서 로컬 bash 스크립트를 어떻게 실행합니까? 푸시하는 방법을 찾고 있습니다.

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

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



답변

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

예 :

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

건배!


답변

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

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합니다.)


답변

이 목적을 위해 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입니다.


답변

이것이 바로 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

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


답변

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

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

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


답변

여기에 대한 답은 ( 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

답변

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

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

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