2012-05-14 1 views
1

여러 ssh 및 scp 호출과 관련된 일련의 명령을 스크립팅하고 싶습니다. SSH 시스템 2에 SYSTEM1에서 SYSTEM1
에 SYSTEM1에 시스템 2에
에서 mkdir/tmp를/데이터를
에서 mkdir/tmp에/데이터를 로컬 시스템에서여러 시스템에 여러 ssh 및 scp 명령을 스크립팅하는 방법

, SSH : 매일에, 내가 찾을 자신은 수동으로 작업을 수행 시스템 2, 시스템 3에 SSH 시스템 3에서

SCP 파일에서
: 시스템 2에/데이터 : 시스템 2에서
SCP 파일 시스템 2 할/tmp를/데이터
종료 :/데이터 및 시스템 2 : SYSTEM1에/tmp에/데이터 :/tmp/data
RM -fr 시스템 2 :/tmp를/데이터 SYSTEM1에서
SYSTEM1에 종료
SCP 파일 :/데이터 및 SYSTEM1 : LOCAL에/tmp에/데이터/데이터
RM -fr SYSTEM1 :/tmp를/데이터

나는 하루에 한 번씩이 과정을 수행하며, 다른 시스템 사이를 이동 한 다음 나중에 정리하는 데 약 5-10 분이 걸립니다. 나는 이것을 bash 스크립트에서 자동화하고 싶다.하지만 아마추어 시도는 실패했다. 예상대로 시스템 통신에 제약이 있습니다. LOCAL은 System1 만 볼 수 있고 System2는 System1 및 System3 만 볼 수 있으며 system3은 system2 만 볼 수 있음을 의미합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 또한 System1은 많은 다른 시스템을위한 허브이므로 SYSTEM2는 사용자가 지정해야합니다 (System3은 항상 SYSTEM2와 비교하여 동일한 상대 IP/호스트 이름을 갖습니다).

쉘 스크립트에서 올바른 순서로 명령을 입력 한 다음 프롬프트가 나타나면 수동으로 입력하는 방법으로 시도했지만 (이 방법은 이미 효율성면에서 엄청난 이득을 얻었을 예정 임) 방법이 작동하지 않거나 실행되지 않습니다. 스크립트가 잘못되었습니다. 또한 'system2'를 연결할 패턴, 복사 할 데이터의 패턴 및 로컬 시스템의 데이터 대상 위치를 취할 스크립트에 대한 명령 줄 인수가 필요합니다. 좀 검색을했다

이러한

./grab_data system2 *05-14* ~/grabbed-data 

로하고 나는 나의 다음 단계는 로컬 작업을 수행하는 각 시스템에 스크립트를 한 다음 각각의 원격 시스템에서 SSH 명령을 통해 스크립트를 실행하는 것입니다 생각 . 더 좋은 방법이 있습니까? 어떤 명령을 사용해야하며이 중첩 된 ssh 및 scp 문제를 자동화하는 일반적인 접근 방법은 무엇입니까?

필자의 설명이 약간 복잡 할 수 있다는 것을 알고 있으므로 제대로 설명하지 않은 부분에 대한 설명을 요청하십시오.

감사합니다.

+0

인형극. 그게 전부입니다. –

+0

또 다른 것은''pssh' (http://parallel-ssh.googlecode.com/git/doc/pssh-HOWTO.html)입니다. [this] (http://serverfault.com/questions/17931/what-is-a-good-modern-parallel-ssh-tool) 및 [this] (http://serverfault.com/questions/2533)도 참조하십시오./linux-running-the-same-command-on-many-machines-at-once)를 사용합니다. –

답변

3

다른 ssh 연결 (참조 : this previous answer 참조)보다 ssh 연결을 터널링하여이 프로세스를 단순화 할 수 있습니다. 내가 할 줄 방법은 다음과 같은 항목이 로컬 시스템에 스푸핑/config 파일을 만드는 것입니다 :

Host SYSTEM3 
     ProxyCommand ssh -e none SYSTEM2 exec /usr/bin/nc %h %p 2>/dev/null 
     HostName  SYSTEM3.full.domain 
     User   system3user 

Host SYSTEM2 
     ProxyCommand ssh -e none SYSTEM1 exec /usr/bin/nc %h %p 2>/dev/null 
     HostName  SYSTEM2.full.domain 
     User   system2user 

Host SYSTEM1 
     HostName  SYSTEM1.full.domain 
     User   system1user 

(즉, 모두 중간 숙주가 netcat을 설치 한 가정 있어요는/usr/빈/노스 캐롤라이나로 - 하지 않으면 것은, 당신이 발견 할 수 있습니다/당신이 LOCAL에 scp SYSTEM3:/data /data을 사용할 수 있습니다,이와

가 설정). TCP 세션에 표준 출력 표준 입력 &를 게이트웨이 할 몇 가지 동등한 방법을 설치, 그것은 SYSTEM1 및 시스템 2를 통해 터널을 자동으로거야 (그리고 세 개의 SYSTEMn에 대한 암호를 요구하십시오. 특히 혼란스러워 할 수 있습니다.

+0

이것은 지금까지 최고의 제안이었습니다. 나는 그것을 시험해 보았고 "System2"에 갈 수는 있지만 불행하게도 키/쌍 잠금 때문에 "System3"에 도달 할 수 없다. 이것은 우리 시스템에서 시스템 관리자가 구현 한 것입니다. 특정 사용자 이름으로 System2에서 System3으로의 SSH 만 가능하며 위에서 설명한 방법을 사용할 때 내 로컬 시스템에서 키/쌍을 거부합니다. 내 로컬 키를 사용하는 대신 System3에 연결할 때 System2의 ssh 키를 사용하도록 프록시 연결을 지정하는 방법이 있습니까? – Raj

+1

제한 사항을 이해하면 ~/.ssh/id_rsa 또는 id_dsa와 같은 id 파일을 SYSTEM2에서 대체 이름 (예 : ~/.ssh/SYSTEM3_id_rsa) 아래의 LOCAL로 복사 한 다음 'IdentityFile ~/.ssh/SYSTEM3_id_rsa'를 LOCAL에있는 설정 파일의 SYSTEM3 섹션에 추가하십시오. –

+0

완벽하게 작동했습니다. 감사합니다. – Raj

-1

나는 다음 중 하나를 사용하십시오 :

puppet - 설정보다 더 않는 구성 관리 도구를!

chef - 만 더 몇 가지의 유연성과 다른 몇 가지

덜 꼭두각시와 같은

terminator 당신이 병렬로 여러 호스트에 연결하고 호스트의 선택된 그룹에 동일한 명령을 전달할 수 있도록 터미널

+0

-1 실제로 요청한 내용에 응답하지 않습니다. – Sorin

0

여러 시스템에 연결하고 특히 중간 호스트를 통해 연결을 전달해야하는 경우에는 ssh-agent 전달을 사용하는 공개 키 인증을 사용하는 것이 좋습니다. 그렇게하면 한 번만 인증하면됩니다.

원격 명령에서 종료 상태를 확인하기 만하면 에이전트 전달 기능을 갖춘 스크립트 된 SSH로 충분할 수 있지만 복잡한 작업을 수행하려는 경우 expect 또는 lite를 사용하여 더 잘 수행 할 수 있습니다 SSH/SCP 세션을보다 유연하게 처리 할 수 ​​있습니다. 특히 대화 형 세션을 강력하게 대체 할 수 있도록 설계되었습니다.

당신이 쉘 스크립트를 고수하고 파일 이름이 많이 변경하는 경우, 당신은 항상 같은 SSH 또는 SCP 래퍼를 만들 수 있습니다

SSH 에이전트와 래퍼 함수 사이
# usage: my_ssh [remote_host] [command_line] 
# returns: exit status of remote command, or 255 on SSH error 
my_ssh() { 
    local host="$1" 
    shift 
    ssh -A "$host" "[email protected]" 
} 

, 당신이해야 자신의 노력을위한 합리적인 출발점.

0

다른 방법으로는 필요한 디렉토리를 자동으로 만드는 rsync를 사용할 수 있습니다. 원할 경우 복사 된 소스 파일을 제거 할 수도 있습니다. 귀하의 경우에는

, 당신은 당신이 Gordon's approach와 함께이 결합하면

home:~$ ssh system1 
system1:~$ ssh system2 
system2:~$ rsync -aPSHiv system3:/data /tmp/data 
system2:~$ exit 
system1:~$ rsync -aPSHiv --remove-source-files system2:/tmp/data /tmp/data 
system1:~$ rsync -aPSHiv system2:/data /tmp/data 
system1:~$ exit 
home:~$ rsync -aPSHiv --remove-source-files system1:/tmp/data /tmp/data 
home:~$ rsync -aPSHiv system1:/data /data 

, 당신도 rsync...data 사이에 차이가 있음을

home:~$ rsync -aPSHiv system1:/data/ system2:/data/ system3:/data/ /data/ 

참고 그것을 줄일 수있는 명령과 함께 일할 수 ...data/ - 전자는 디렉토리와 그 내용을 의미하고, 후자는 내용을 의미합니다. 그것들을 섞으면 다른 디렉토리에 data이라는 디렉토리로 끝날 수도 있습니다. data.

게다가 암호 대신 공개 SSH 키로 작업하면 단순화 할 수 있습니다.