리눅스

멀티_커맨드

박히응 2025. 4. 8. 16:09

실행 목적

서버 리스트를 통한 일괄적인 명령어 실행 후 결과값을 result 파일에 저장

실제 경로 내 파일

[ph702@DA-CC-SC02 command]$ ls
list  result  script

실행 순서

  1. list 파일 내에 서버 IP 기입
  2. ./script '(명령어)' 입력
    1. ex) ./script 'df -h'

작성 내용

#!/bin/bash

SCRIPT_DIR=$(dirname "$0")
list="$SCRIPT_DIR/list"

# list 파일 확인
if [ ! -f $list ]; then
    echo "list 파일을 생성해주세요."
    exit 1
fi

if [ ! -s $list ]; then
    echo "list 안에 server ip를 확인해주세요."
    exit 1
fi

# 명령어 확인
if [ $# -lt 1 ]; then
    echo "명령어를 확인해주세요"
    exit 1
fi

COMMAND=$*

C=0
S=$(cat $list | wc -l)

# 사용자 정보
echo -n "계정 ID를 입력해주세요: "
read USERNAME
echo -n "패스워드를 입력해주세요: "
read -s PASSWORD
echo

# 결과 파일
OUTPUT_FILE="result"
> "$OUTPUT_FILE"

for i in $(cat $list); do
    if [ "$(echo $i | grep -c '#')" -eq 0 ]; then
        C=$((C+1))
        echo "====== $C / $S ======="
        echo "$i:$COMMAND"

        echo "====== $i ======" >> "$OUTPUT_FILE"

        # SSH 실행 + 출력 제거 + 출력 기반 타임아웃 적용
        sshpass -p "$PASSWORD" ssh -o StrictHostKeyChecking=no -t "$USERNAME@$i" \
            "bash -c \"$COMMAND\"" 2>&1 \
            | grep -v "Connection to" \
            | (
                while IFS= read -r -t 1 line; do
                    echo "$line" >> "$OUTPUT_FILE"
                done

                # read -t 가 timeout (출력멈춤) → SSH 종료
                pkill -P $$ ssh 2>/dev/null
            )

        echo "" >> "$OUTPUT_FILE"
        echo " $i 서버의 명령어 실행 결과를 $OUTPUT_FILE에 저장하였습니다."
    fi
done

echo "명령어 실행이 완료되었습니다."