IT 관리 노하우/서버 & Linux

리눅스에서 구현하는 간단한 메뉴 UI - whiptail 알아보기

잌쿠 2025. 6. 3. 09:23

회사에서 리눅스 서버를 여러 대 관리하다 보면, 단순한 쉘 스크립트만으로는 사용자 입력을 받거나, 실수 없이 설정을 진행하는 게 쉽지 않더라고요. 특히, 누군가에게 서버 초기 세팅을 맡길 때는 더더욱 그렇죠.

그래서 "쉘 환경에서 입력을 제한하고, 사용성을 높일 수 있는 메뉴 UI가 없을까?" 고민하다가, 별도의 설치 없이 기본적으로 제공되는 whiptail이라는 명령어를 알게 됐습니다.

사실 처음엔 "이런 게 정말 쓸모 있을까?" 싶었는데, 막상 써보니 생각보다 유용해서, 오늘은 그 경험을 공유해보려 합니다.

 


 

whiptail 기능 상세 소개

whiptail이란?

whiptail은 리눅스/유닉스 환경에서 대화형 텍스트 기반 UI(메뉴, 입력창 등)를 쉽게 만들 수 있는 명령어입니다.
별도의 설치 없이 대부분의 배포판에 기본 포함되어 있고, dialog와 비슷하지만 더 가볍고, 스크립트에서 사용하기 딱 좋습니다.

  • 주요 기능
    • 메뉴 선택(라디오/체크박스)
    • 텍스트 입력/비밀번호 입력
    • 메시지/경고창
    • 진행바 등

 

간단한 샘플 코드 – 메뉴 선택 후 값 표시

아래는 whiptail로 간단한 메뉴를 만들고, 사용자가 선택한 값을 출력하는 예시입니다.

#!/bin/bash

CHOICE=$(whiptail --title "메뉴 선택" --menu "원하는 작업을 선택하세요:" 15 60 4 \
"1" "메뉴1" \
"2" "메뉴2" \
"3" "종료" 3>&1 1>&2 2>&3)

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "선택한 메뉴: $CHOICE"
else
    echo "취소하셨습니다."
fi
  • 설명
    • --menu 옵션으로 메뉴 UI 생성
    • 선택 결과는 변수 CHOICE에 저장
    • 사용자가 [취소]를 누르면 exit status로 구분

 

실전 샘플 – PC 초기 세팅 자동화 스크립트

이번엔 실제로 많이 쓰는 "PC 초기 세팅"용 whiptail 스크립트 예시입니다.
호스트네임 변경, 네트워크(고정 IP) 설정을 메뉴로 선택해서 진행할 수 있습니다.

#!/bin/bash

while true; do
    CHOICE=$(whiptail --title "PC 초기 세팅" --menu "실행할 작업을 선택하세요:" 15 60 4 \
    "1" "호스트네임 변경" \
    "2" "네트워크 설정(고정 IP)" \
    "3" "종료" 3>&1 1>&2 2>&3)

    [ $? -ne 0 ] && break

    case $CHOICE in
        1)
            NEW_HOSTNAME=$(whiptail --inputbox "새 호스트네임을 입력하세요:" 10 60 --title "호스트네임 변경" 3>&1 1>&2 2>&3)
            if [ $? -eq 0 ] && [ -n "$NEW_HOSTNAME" ]; then
                hostnamectl set-hostname "$NEW_HOSTNAME"
                whiptail --msgbox "호스트네임이 $NEW_HOSTNAME(으)로 변경되었습니다." 8 60
            fi
            ;;
        2)
            IP=$(whiptail --inputbox "고정 IP 주소를 입력하세요:" 10 60 --title "네트워크 설정" 3>&1 1>&2 2>&3)
            GATEWAY=$(whiptail --inputbox "게이트웨이 주소를 입력하세요:" 10 60 --title "네트워크 설정" 3>&1 1>&2 2>&3)
            DNS=$(whiptail --inputbox "DNS 주소를 입력하세요:" 10 60 --title "네트워크 설정" 3>&1 1>&2 2>&3)
            IFACE=$(whiptail --inputbox "설정할 인터페이스명(예: eth0):" 10 60 --title "네트워크 설정" 3>&1 1>&2 2>&3)
            if [ -n "$IP" ] && [ -n "$GATEWAY" ] && [ -n "$DNS" ] && [ -n "$IFACE" ]; then
                cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-$IFACE
DEVICE=$IFACE
BOOTPROTO=static
ONBOOT=yes
IPADDR=$IP
GATEWAY=$GATEWAY
DNS1=$DNS
EOF
                systemctl restart network
                whiptail --msgbox "네트워크 설정이 완료되었습니다." 8 60
            fi
            ;;
        3)
            break
            ;;
    esac
done
  • 설명
    • 반복 메뉴로 여러 작업을 연속 처리 가능
    • 각 단계마다 입력값을 받아 실제 시스템 설정에 반영
    • 실수 방지 및 자동화에 유용

⚠️ 주의: 네트워크 설정 부분은 배포판(예: Ubuntu, CentOS 등)에 따라 경로/명령이 다를 수 있으니, 실제 환경에 맞게 수정 필요!


 

장단점과 실무 팁

  • 장점
    • 별도 설치 없이 바로 사용 가능
    • 스크립트에 UI를 더해 실수 방지
    • 반복 작업 자동화에 적합
  • 아쉬운 점
    • GUI가 아니라서 한글 입력/출력에 제한이 있을 수 있음
    • 복잡한 UI는 한계가 있음
  • 실무 팁
    • 메뉴/입력값 검증 로직을 꼭 추가할 것
    • sudo/root 권한이 필요한 명령은 주의
    • 테스트 환경에서 충분히 검증 후 실서비스 적용

마치며

whiptail은 "쉘 스크립트도 사용자 친화적으로 만들 수 있다"는 걸 보여주는 좋은 도구입니다.

특히, IT 관리자라면 반복되는 서버 세팅이나, 실수 방지가 중요한 작업에 whiptail을 한 번쯤 적용해보시길 추천합니다.
앞으로 더 복잡한 자동화에도 도전해보고, 실무에서 겪은 시행착오와 개선점을 계속 공유해볼게요!