원격 컴퓨터에 아무것도 설치할 필요없이 하나의 중앙 컴퓨터에서 여러 원격 컴퓨터로 구성을 푸시하는 방법을 찾고 있습니다.
목표는와 같은 도구로 찾을 수 cfengine
있지만 에이전트가 설정되지 않은 일련의 시스템에서 수행하는 것과 같은 작업을 수행하는 것입니다. 이것은 실제로 cfagent
기존 원격 시스템 세트를 설정하는 좋은 기술 일 수 있습니다 .
원격 컴퓨터에 아무것도 설치할 필요없이 하나의 중앙 컴퓨터에서 여러 원격 컴퓨터로 구성을 푸시하는 방법을 찾고 있습니다.
목표는와 같은 도구로 찾을 수 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
건배!
여러 가지 방법이 있습니다.
ssh user@remote_server 'bash -s' < localfile
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입니다.
run
및 사용 sudo
) 필요하지 않습니다.
이것이 바로 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
기본적으로 여러 서버에서 명령을 실행하기위한 명령 줄 도구로 사용하기 시작하고 적절하다고 생각되면 사용법을 완전한 구성 도구로 확장 할 수 있습니다.
ansible webhosts -m script script.sh
여기에 대한 답은 ( https://stackoverflow.com/a/2732991/4752883 사용하여 원격 리눅스 컴퓨터에서 스크립트를 실행하려고하는 경우) 좋은 작품 plink
이나 ssh
. 스크립트에 여러 줄이 있으면 작동합니다 linux
.
** 그러나 로컬 linux/windows
컴퓨터 에있는 배치 스크립트를 실행하려고 시도하고 원격 컴퓨터가 Windows
이고 **를 사용하는 여러 줄로 구성된 경우
plink root@MachineB -m local_script.bat
작동하지 않습니다.
스크립트의 첫 번째 줄만 실행됩니다. 이것은 아마도 한계입니다 plink
.
여러 줄 배치 스크립트를 실행하려면 (특히 비교적 간단한 경우 몇 줄로 구성) :
원래 배치 스크립트가 다음과 같은 경우
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
배치 스크립트가 비교적 복잡한 경우 여기에서 @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"
물론 세계에서 쓸 수있는 장소에 업로드하지 않도록주의해야합니다.
각 명령에 이미 ssh 가 붙어 있고 호스트 이름 / ip 또는 그러한 목록이 인수로 스크립트에 전달 되는 방식으로 스크립트를 다시 작성하십시오 (암호 없음 / ssh- 에이전트 키 인증이 설정되어 있다고 가정). 원격 명령에서 오류 / 리턴 코드를 올바르게 전달하려면 일부 작업이 필요할 수 있습니다.
스크립트가 너무 크지 않고 bash 또는 ksh를 사용하는 경우 ...
ssh vm24 -t bash -c "$(printf "%q" "$(< shell-test.sh )")"
stdin과 stdout은 모두 올바르게 작동하지만 스크립트는 인수 크기 (일반적으로 약 100k)로 제한됩니다. 줄 끝에서 스크립트에 대한 인수가 추가 "-"인수 뒤에 올 수 있습니다. pty를 할당하기위한 "-t"는 선택 사항입니다.
조심하십시오 : 이것은 bash-completion을 혼란스럽게합니다. 탭을 누르지 마십시오.