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

두 가지 질문이 있습니다.

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

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



답변

여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 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.

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


답변

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

내가 가장 좋아하는 방법은 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