두 가지 질문이 있습니다.
- 여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 sudo 작업 포함). 쉘 스크립팅을 사용하여 어떻게 할 수 있습니까?
- 원격 컴퓨터에 ssh'ing 할 때 RSA 지문 인증을 요구할 때 처리하는 방법.
원격 머신은 실행시 생성 된 VM이며 IP 만 있습니다. 따라서 해당 시스템에 스크립트 파일을 미리 배치하고 내 시스템에서 실행할 수 없습니다.
두 가지 질문이 있습니다.
원격 머신은 실행시 생성 된 VM이며 IP 만 있습니다. 따라서 해당 시스템에 스크립트 파일을 미리 배치하고 내 시스템에서 실행할 수 없습니다.
expect
`expect " ? assword : "`
답변:
여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 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=no
ssh에 옵션을 추가 할 수 있습니다 .
ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"
그러면 호스트 키 검사 가 비활성화 됩니다. 알려진 호스트 목록에 호스트 키가 자동으로 추가됩니다. 알려진 호스트 파일에 호스트를 추가하지 않으려면 옵션을 추가합니다 -o UserKnownHostsFile=/dev/null
.
이렇게 하면 메시지 가로 채기 공격에 대한 보호와 같은 특정 보안 검사가 비활성화 됩니다. 따라서 보안에 민감한 환경에 적용해서는 안됩니다.
ssh
있는 쉘 스크립트에서
이를 처리하는 방법에는 여러 가지가 있습니다.
내가 가장 좋아하는 방법은 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
를 사용하여 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
Perl 코드를 작성할 수 있다면 Net :: OpenSSH :: Parallel 사용을 고려해야 합니다.
선언적인 방식으로 모든 호스트에서 실행해야하는 작업을 설명 할 수 있으며 모듈은 모든 무서운 세부 사항을 처리합니다. 명령 실행 sudo
도 지원됩니다.
이것은 나를 위해 일합니다.
구문 : 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'
이런 종류의 작업 을 위해 여러 컨테이너 또는 VM에서 일관되게 bash 스크립트를 복제 할 수있는 Ansible 을 반복적으로 사용 합니다. Ansible (더 정확하게는 Red Hat )에는 이제 추가 웹 인터페이스 AWX가 있습니다. 상용 Tower의 오픈 소스 버전 인 가 있습니다.
Ansible : https://www.ansible.com/
AWX : https://github.com/ansible/awx
Ansible Tower : 상용 제품, 아마도 15 일간의 무료 트레일이 아닌 무료 오픈 소스 AWX를 먼저 탐색 할 것입니다. 타워
여러 원격 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
이것은 나를 위해 일했습니다. 기능을 만들었습니다. 이것을 쉘 스크립트에 넣으십시오.
sshcmd(){
ssh $1@$2 $3
}
sshcmd USER HOST COMMAND
동일한 명령을 수행하려는 시스템이 여러 개있는 경우 세미콜론으로 해당 행을 반복합니다. 예를 들어, 두 대의 컴퓨터가있는 경우 다음을 수행합니다.
sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND
USER를 컴퓨터 사용자로 바꿉니다. HOST를 컴퓨터 이름으로 바꿉니다. COMMAND를 컴퓨터에서 수행 할 명령으로 바꿉니다.
도움이 되었기를 바랍니다!
이 접근 방식을 따를 수 있습니다.