ssh를 원격 시스템에 셸 스크립트를 작성하고 명령을 실행합니다.


97

두 가지 질문이 있습니다.

  1. 여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 sudo 작업 포함). 쉘 스크립팅을 사용하여 어떻게 할 수 있습니까?
  2. 원격 컴퓨터에 ssh'ing 할 때 RSA 지문 인증을 요구할 때 처리하는 방법.

원격 머신은 실행시 생성 된 VM이며 IP 만 있습니다. 따라서 해당 시스템에 스크립트 파일을 미리 배치하고 내 시스템에서 실행할 수 없습니다.


네트워크 소켓 (또는 SSL) 연결 / 서버에 대한 주기적 폴링으로 서버와의 연결을 유지하는 원격 Linux 시스템에 에이전트와 같은 프로그램을 배포하는 것을 생각합니다.
Raptor

는 연결 유지하는 데 필요하지 않습니다 그래서 내가 한 번만 일련의 명령을 실행해야
Balanivash

"스크립트 없음"은 "파일 없음"을 의미합니다. 인증은 어떻게 처리합니까? 호스트 지문 검사를 비활성화 할 수 있지만 (내 대답 참조) 공개 / 개인 키를 설정하지 않은 경우에도 대화 형 암호 프롬프트가 표시됩니다.
Andreas Fester

1
Andreas : 네. 전혀 파일이 없습니다. passwd 프롬프트는 expect`expect " ? assword : "`
Balanivash

답변:


142

여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 sudo 작업 포함). 쉘 스크립팅을 사용하여 어떻게 할 수 있습니까?

ssh로이를 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

원격 컴퓨터에 ssh'ing 할 때 RSA 지문 인증을 요구할 때 처리하는 방법.

StrictHostKeyChecking=nossh에 옵션을 추가 할 수 있습니다 .

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

그러면 호스트 키 검사비활성화 됩니다. 알려진 호스트 목록에 호스트 키가 자동으로 추가됩니다. 알려진 호스트 파일에 호스트를 추가하지 않으려면 옵션을 추가합니다 -o UserKnownHostsFile=/dev/null.

이렇게 하면 메시지 가로 채기 공격에 대한 보호와 같은 특정 보안 검사가 비활성화 됩니다. 따라서 보안에 민감한 환경에 적용해서는 안됩니다.


스크립팅 언어는 무엇입니까? 당신은 물론 또한 호출 할 수 ssh있는 쉘 스크립트에서
안드레아스 스터 (Fester)에게

CTRL + C를 수행하고 여러 서버에 ssh를 계속하려면 어떻게해야합니까?. 예를 들어 일부 서버에서는 비밀번호를 요구하고 다른 일부에서는 아니오를 요구하므로 스크립트가 거기에 멈 춥니 다. CTRL c 또는 CTRL d를 수행하기 위해 -o와 유사한 somethong을 수행하는 방법이 있습니까?
Chanafot

5

이를 처리하는 방법에는 여러 가지가 있습니다.

내가 가장 좋아하는 방법은 http://pamsshagentauth.sourceforge.net/ 을 원격 시스템에 설치 하고 자신의 공개 키 를 설치하는 것입니다 . (이것을 VM에 설치하는 방법을 찾으십시오. 어떻게 든 전체 Unix 시스템이 설치되어 있습니다. 몇 개의 파일이 더 있습니까?)

ssh 에이전트가 전달되면 이제 암호없이 모든 시스템에 로그인 할 수 있습니다.

더 좋은 점은이 pam 모듈이 ssh 키 쌍으로 sudo를 인증하므로 필요에 따라 루트 (또는 다른 사용자) 권한으로 실행할 수 있습니다.

호스트 키 상호 작용에 대해 걱정할 필요가 없습니다. 입력이 터미널이 아닌 경우 ssh는 에이전트를 전달하고 암호로 인증하는 기능을 제한합니다.

Capistrano와 같은 패키지도 살펴 봐야합니다 . 확실히 그 사이트를 둘러보세요. 원격 스크립팅에 대한 소개가 있습니다.

개별 스크립트 행은 다음과 같습니다.

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

4

를 사용하여 sshpass를 설치 apt-get install sshpass한 다음 스크립트를 편집하고 Linux 시스템 IP, 사용자 이름 및 암호를 각각의 순서로 입력하십시오. 그 후 해당 스크립트를 실행하십시오. 그게 다야! 이 스크립트는 모든 시스템에 VLC를 설치합니다.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

스크립트에 표시되지 않도록 $ SSHPASS를 사용하여 비밀번호를 내보내십시오. 참조 : tecmint.com/…
Hexy

2

Perl 코드를 작성할 수 있다면 Net :: OpenSSH :: Parallel 사용을 고려해야 합니다.

선언적인 방식으로 모든 호스트에서 실행해야하는 작업을 설명 할 수 있으며 모듈은 모든 무서운 세부 사항을 처리합니다. 명령 실행 sudo도 지원됩니다.


2

이것은 나를 위해 일합니다.

구문 : ssh -i pemfile.pem user_name @ ip_address 'command_1; 명령 2; 명령 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

1

이런 종류의 작업 을 위해 여러 컨테이너 또는 VM에서 일관되게 bash 스크립트를 복제 할 수있는 Ansible 을 반복적으로 사용 합니다. Ansible (더 정확하게는 Red Hat )에는 이제 추가 웹 인터페이스 AWX가 있습니다. 상용 Tower의 오픈 소스 버전 인 가 있습니다.

Ansible : https://www.ansible.com/
AWX : https://github.com/ansible/awx
Ansible Tower : 상용 제품, 아마도 15 일간의 무료 트레일이 아닌 무료 오픈 소스 AWX를 먼저 탐색 할 것입니다. 타워


1

여러 원격 Linux 시스템에서 명령이나 스크립트를 실행하는 방법에는 여러 가지가 있습니다. 간단하고 쉬운 방법 중 하나는 pssh (병렬 ssh 프로그램)를

이용하는 것입니다 . pssh : 여러 호스트에서 병렬로 ssh를 실행하는 프로그램입니다. 모든 프로세스에 입력 보내기, ssh에 암호 전달, 파일에 출력 저장 및 시간 초과와 같은 기능을 제공합니다.

예 및 사용법 :

host1 및 host2에 연결하고 각각에서 "hello, world"를 인쇄합니다.

 pssh -i -H "host1 host2" echo "hello, world"

여러 서버에서 스크립트를 통해 명령 실행 :

pssh -h hosts.txt -P -I<./commands.sh

호스트 키를 확인하거나 저장하지 않고 사용 및 명령 실행 :

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

hosts.txt 파일에 많은 항목 (예 : 100)이있는 경우 parallelism 옵션을 100으로 설정하여 명령이 동시에 실행되도록 할 수도 있습니다.

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

옵션 :
-I : 입력을 읽고 각 ssh 프로세스로 보냅니다.
-P : 출력이 도착하면 출력을 표시하도록 pssh에 지시합니다.
-h : 호스트의 파일을 읽습니다.
-H : 단일 호스트의 경우 [user @] host [: port].
-i : 각 호스트가 완료 될 때 표준 출력 및 표준 오류 표시
-x args : 추가 SSH 명령 줄 인수를 전달합니다.
-o 옵션 : 구성 파일에 사용 된 형식으로 옵션을 제공하는 데 사용할 수 있습니다. ) (~ / .ssh / config)
-p parallelism : 주어진 수를 최대 동시 연결 수로 사용합니다 .
-q 자동 모드 : 대부분의 경고 및 진단 메시지가 표시되지 않도록합니다.
-t : 주어진 시간 (초) 후에 연결 시간이 초과되도록합니다. 0은 pssh가 연결 시간을 초과하지 않음을 의미합니다.

원격 컴퓨터에 ssh'ing 할 때 RSA 지문 인증을 요구할 때 처리하는 방법.

RSA 인증 프롬프트를 처리하려면 StrictHostKeyChecking을 비활성화하십시오.
-o StrictHostKeyChecking = 아니요

출처 : man pssh


0

이것은 나를 위해 일했습니다. 기능을 만들었습니다. 이것을 쉘 스크립트에 넣으십시오.

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

동일한 명령을 수행하려는 시스템이 여러 개있는 경우 세미콜론으로 해당 행을 반복합니다. 예를 들어, 두 대의 컴퓨터가있는 경우 다음을 수행합니다.

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

USER를 컴퓨터 사용자로 바꿉니다. HOST를 컴퓨터 이름으로 바꿉니다. COMMAND를 컴퓨터에서 수행 할 명령으로 바꿉니다.

도움이 되었기를 바랍니다!


-1

이 접근 방식을 따를 수 있습니다.

  • Expect Script를 사용하여 원격 컴퓨터에 연결합니다 . 컴퓨터가 지원하지 않는 경우에도 동일하게 다운로드 할 수 있습니다. Expect 스크립트 작성은 매우 쉽습니다.
  • 원격 서버에서 수행해야하는 모든 작업을 쉘 스크립트에 넣으십시오.
  • 로그인이 성공하면 expect 스크립트에서 원격 쉘 스크립트를 호출하십시오.

질문에서 언급했듯이 원격 컴퓨터는 실행 중에 생성되며 미리 컴퓨터에 스크립트를 가질 수 없습니다.
Balanivash

이 경우 모든 작업을 Expect 스크립트에 넣으십시오. Expect 스크립트는 원격 호스트에서도 명령을 실행할 수 있습니다.
rai.skumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.