IT박스

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

itboxs 2020. 9. 22. 07:57
반응형

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도 지원됩니다.


For this kind of tasks, I repeatedly use Ansible which allows to duplicate coherently bash scripts in several containets or VM. Ansible (more precisely Red Hat) now has an additional web interface AWX which is the open-source edition of their commercial Tower.

Ansible: https://www.ansible.com/
AWX:https://github.com/ansible/awx
Ansible Tower: commercial product, you will probably fist explore the free open-source AWX, rather than the 15days free-trail of Tower


This work for me.

Syntax : ssh -i pemfile.pem user_name@ip_address 'command_1 ; command 2; command 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'

You can follow this approach :

  • Connect to remote machine using Expect Script. If your machine doesn't support expect you can download the same. Writing Expect script is very easy (google to get help on this)
  • Put all the action which needs to be performed on remote server in a shell script.
  • Invoke remote shell script from expect script once login is successful.

참고URL : https://stackoverflow.com/questions/13928116/write-a-shell-script-to-ssh-to-a-remote-machine-and-execute-commands

반응형