- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: cat, ssh, hostname, ping
키워드: P 주소, 분기, 일치, 문자열
사용처: 로컬에 있는 셸 스크립트를 접속한 곳에 복사하지 않고 ssh로 실행하고 싶을 때
실행 예제
$ ./script-remote.sh
server04
Ping to 192.168.2.35 : [OK]
server05
Ping to 192.168.2.35 : [NG]
server06
Ping to 192.168.2.35 : [OK]
스크립트 1
#!/bin/sh
username="user1"
script="check.sh"
cat $script | ssh ${username}@192.168.2.4 "sh" # -- 1
cat $script | ssh ${username}@192.168.2.5 "sh"
cat $script | ssh ${username}@192.168.2.6 "sh"
스크립트 2
#!/bin/sh
# 개통 확인할 대상 서버
checkserver="192.168.2.35"
# 스크립트를 실행한 호스트명 표시
hostname # ---------------------------------------- 2
# 서버 개통을 ping 명령어로 확인
ping -c 1 "$checkserver" > /dev/null 2>&1 # ------- 3
if [ $? -eq 0 ]; then # if문 ---------------------- 4
echo "Ping to $checkserver : [OK]"
else
echo "Ping to $checkserver : [NG]"
fi
해설
이 스크립트는 여러 서버를 순차적으로 로그인해서 특정 서버(스크립트 2의 셸 변수 checkserver로 정의한 192.168.2.35)와 통신이 정상적인지 확인합니다.
- 여러 서버에서 특정서버로 통신 가능한지 확인
script-remote.sh 스크립트를 실행해서 로컬에 있는 확인용 스크립트 파일(check.sh)을 ssh 로그인한 서버에서 직접 실행시키는 것이 포인트입니다. 이런 스크립트 사용법은 이런 경우에 활용 가능합니다.
- 여러 서버에서 설정 내용이 같은지 확인하는 명령어 실행
- 네트워크 설정이 전부 같은지 설정 파일 확인
1
은 로컬에 설치된 셸 스크립트 파일을 ssh 접속한 서버에서 직접 실행하는 부분입니다. 여기에서는 3개 서버를 server04(192.168.2.4), server05(192.168.2.5), server06(192.168.2.6) 순서대로 실행합니다.
ssh 명령어는 [사용자명@서버명] 뒤에 인수를 주면 원격 서버에서 실행할 명령어를 지정할 수 있습니다. 1
에서는 “sh”를 지정해서 비 인터랙티브 셸을 실행합니다. 이때 표준 입력은 터미널이 할당되지 않으므로 cat 명령어로 로컬 스크립트를 표준 입력에 할당하면 셸 스크립트를 실행할 수 있습니다.
원격 서버에서 실제로 실행하는 셸 스크립트가 check.sh입니다. 우선 2
에서 hostname 명령어를 실행해서 동작하는 원격 서버의 호스트명을 표시합니다. 그후 3
에서 셸 변수 checkserver로 지정한 곳에 ping 명령어를 실행해서 개통을 확인합니다. 4
에서 종료 스테이터스 $?가 0인지 확인해서 성공인지 실패인지 판단해 ping 명령어가 성공했으면 [OK], 실패했으면 [NG]를 표시합니다.
이렇게 파일을 복사하지 않고도 원격으로 셸 스크립트 파일을 실행할 수 있습니다. 여러 서버에 같은 셸 스크립트를 실행하고 싶을 때 편리합니다.
비 인터랙티브 셸과 인터랙티브 셸
앞서 ‘원격 서버에서 sh를 비 인터랙티브 셸로 실행합니다’라고 설명했는데 조금 보충하겠습니다.
비 인터랙티브 셸은 인터랙티브(대화형)가 아닌 셸입니다. 즉 입력을 위한 키보드나 표시를 위한 터미널이 접속되지 않은 셸입니다. 예를 들어 셸 스크립트를 실행하기 위해 실행되는 셸이 있습니다. 터미널에서 ./script.sh 같은 명령어를 실행하면 비 인터랙티브 셸이 실행되어 셸 스크립트를 실행하게 됩니다.
사용자가 키보드로 조작하는 셸은 인터랙티브 셸입니다. 즉, 입출력을 위해 키보드와 터미널이 접속되어서 셸에서 실행할 처리를 키보드로 직접 입력받습니다.
비 인터랙티브 셸과 인터랙티브 셸은 실행 시 읽어들이는 설정 파일이 조금 다릅니다. 이런 차이는 sh나 bash 매뉴얼을 참조하기 바랍니다.