ssh를 원격 시스템에 셸 스크립트를 작성하고 명령을 실행합니다.
두 가지 질문이 있습니다.
- 여러 개의 원격 리눅스 머신이 있으며, 각 머신에서 동일한 명령 세트를 실행할 쉘 스크립트를 작성해야합니다. (일부 sudo 작업 포함). 쉘 스크립팅을 사용하여 어떻게 할 수 있습니까?
- 원격 컴퓨터에 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=no
ssh에 옵션을 추가 할 수 있습니다 .
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.
'IT박스' 카테고리의 다른 글
내부 애플리케이션을위한 최상의 TCP 포트 번호 범위 (0) | 2020.09.22 |
---|---|
git에서 숨김을 적용하지 않고 추적되지 않은 숨김 파일을 표시하는 방법이 있습니까? (0) | 2020.09.22 |
ThreadStatic 대 ThreadLocal (0) | 2020.09.22 |
C ++에서 operator &를 사용하는 대신 std :: addressof () 함수 템플릿을 사용하면 어떤 이점이 있습니까? (0) | 2020.09.22 |
Redux Reducer에서 저장소의 초기 상태 읽기 (0) | 2020.09.21 |