[카테고리:] 개발

  • MariaDB 데이터베이스 자동백업, 30일이 지난 파일을 자동으로 삭제하는 Bash 스크립트

    MariaDB 데이터베이스를 자동으로 백업하고, 백업 파일 이름을 현재 시간으로 설정하며, 30일이 지난 파일을 자동으로 삭제하는 Bash 스크립트를 아래에 작성했습니다.

    이 스크립트는:

    1. MariaDB 데이터베이스를 백업하고, 파일 이름을 YYYYMMDD_HHMMSS 형식으로 저장합니다.
    2. 백업 폴더 내의 30일 이상된 오래된 백업 파일을 삭제합니다.

    1. MariaDB 데이터베이스 백업 및 오래된 백업 파일 삭제 스크립트

    스크립트: backup_mariadb.sh

    #!/bin/bash

    # 변수 설정
    DB_USER="your_db_user" # MariaDB 사용자명
    DB_PASSWORD="your_db_password" # MariaDB 비밀번호
    DB_NAME="your_db_name" # 백업할 MariaDB 데이터베이스 이름
    BACKUP_DIR="/path/to/backup" # 백업 파일을 저장할 디렉터리
    DATE=$(date +"%Y%m%d_%H%M%S") # 현재 날짜 및 시간 (백업 파일명에 사용)
    BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_backup_${DATE}.sql" # 백업 파일 경로

    # 백업 디렉토리가 존재하는지 확인하고 없으면 생성
    if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    fi

    # MariaDB 데이터베이스 백업
    mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_FILE"

    # 백업이 성공적으로 완료되었는지 확인
    if [ $? -eq 0 ]; then
    echo "백업이 성공적으로 완료되었습니다: $BACKUP_FILE"
    else
    echo "백업에 실패했습니다."
    exit 1
    fi

    # 30일 이상된 백업 파일 삭제
    find "$BACKUP_DIR" -name "${DB_NAME}_backup_*.sql" -type f -mtime +30 -exec rm -f {} \;

    # 삭제된 파일에 대한 로그 출력
    echo "30일 이상된 백업 파일이 삭제되었습니다."

    2. 스크립트 설명

    • 백업 파일 이름: DATE 변수는 현재 날짜와 시간을 YYYYMMDD_HHMMSS 형식으로 저장합니다. 이를 통해 백업 파일 이름이 고유하게 생성됩니다.
      • 예: your_db_name_backup_20250228_123000.sql
    • MariaDB 백업: mysqldump 명령어를 사용하여 데이터베이스를 백업합니다. -p"$DB_PASSWORD"를 사용해 비밀번호를 입력합니다.
    • 백업 폴더 확인 및 생성: 백업 폴더가 존재하지 않으면 mkdir -p 명령어로 생성합니다.
    • 30일 이상된 파일 삭제: find 명령어를 사용하여 백업 폴더 내에서 30일 이상된 .sql 파일을 찾아 삭제합니다.
      • -mtime +30 옵션은 30일 이상된 파일을 찾습니다.

    3. 자동 실행 설정 (crontab 사용)

    위의 스크립트를 주기적으로 실행하도록 crontab을 설정할 수 있습니다.

    1. 터미널에서 crontab 파일을 엽니다:
    crontab -e
    1. 매일 자정(0시)에 백업 스크립트를 실행하도록 설정:
    0 0 * * * /path/to/backup_mariadb.sh

    위 설정은 매일 자정에 backup_mariadb.sh 스크립트를 실행하여 MariaDB 데이터베이스를 백업하고, 30일이 지난 파일을 삭제합니다.

    4. 권한 문제 해결

    스크립트를 실행할 때 권한 문제가 발생하면, 실행 권한을 추가해야 합니다. 터미널에서 다음 명령어를 입력하여 실행 권한을 부여합니다:

    chmod +x /path/to/backup_mariadb.sh

    그리고, 해당 스크립트가 MariaDB에 접근할 수 있도록 MySQL/MariaDB 사용자 권한을 확인하거나 추가해야 할 수도 있습니다.

    5. 백업 파일 이름 예시

    백업 파일 이름은 다음과 같이 생성됩니다:

    your_db_name_backup_20250228_123000.sql

    이 방식으로 스크립트가 작동하면 각 백업이 고유한 이름을 가지며, 30일이 지난 파일은 자동으로 삭제됩니다.

  • 우분투 특정 데이터베이스(MariaDB)를 자동으로 백업 폴더에 저장하는 Bash 스크립트

    백업 파일 이름을 현재 시간으로 설정하려면, 스크립트에서 DATE 변수를 사용하여 현재 시간을 파일 이름에 반영할 수 있습니다. 아래 예시에서는 파일 이름을 YYYYMMDD_HHMMSS 형식으로 설정하여, 각 백업이 고유한 시간에 맞는 이름을 가질 수 있도록 했습니다.

    1. mariadb 데이터베이스 백업 스크립트 (현재 시간 기준 파일 이름)

    스크립트: backup_db.sh

    #!/bin/bash

    # 변수 설정
    DB_USER="your_db_user" # 데이터베이스 사용자명
    DB_PASSWORD="your_db_password" # 데이터베이스 비밀번호
    DB_NAME="your_db_name" # 백업할 데이터베이스 이름
    BACKUP_DIR="/path/to/backup" # 백업을 저장할 디렉터리
    DATE=$(date +"%Y%m%d_%H%M%S") # 현재 날짜 및 시간 (백업 파일명에 사용)
    BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_backup_${DATE}.sql" # 백업 파일 경로

    # 백업 디렉토리가 존재하는지 확인하고 없으면 생성
    if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    fi

    # MySQL 데이터베이스 백업
    mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_FILE"

    # 백업이 성공적으로 완료되었는지 확인
    if [ $? -eq 0 ]; then
    echo "백업이 성공적으로 완료되었습니다: $BACKUP_FILE"
    else
    echo "백업에 실패했습니다."
    fi

    스크립트 실행권한주기

    chmod +x /path/to/your/backup_db.sh

    2. 자동 실행 설정 (crontab 사용)

    위의 스크립트를 매일 자동으로 실행하도록 설정하려면, crontab을 사용할 수 있습니다.

    1. 터미널에서 crontab 파일을 엽니다:
    crontab -e
    1. 매일 자정(0시)에 백업 스크립트를 실행하도록 추가:
    0 0 * * * /path/to/your/backup_db.sh

    위 설정은 매일 자정에 backup_db.sh 스크립트를 실행하여 데이터베이스를 백업하고, 백업 파일 이름을 현재 시간으로 저장하도록 설정합니다.

    백업 파일 이름 예시

    • MariaDB 백업 파일 이름은 다음과 같이 생성됩니다:
    • your_db_name_backup_20250228_123000.sql

    이렇게 하면 각 백업 파일이 정확한 시간에 따라 구분되며, 여러 번의 백업이 덮어쓰이지 않도록 할 수 있습니다.

  • 우분투 DDOS 공격시 이더넷 자동변환 bash 스크립트

    아래는 DDoS 공격이 감지될 경우 이더넷 인터페이스를 자동으로 전환하고, 추가 공격이 발생하면 다시 전환하도록 설정된 Bash 스크립트입니다.

    기능 설명

    1. DDoS 감지: rx_packets를 모니터링하여 일정 초당 패킷 수(예: 10,000)를 초과하면 공격으로 판단
    2. 이더넷 인터페이스 전환: eth0eth1을 번갈아가며 변경
    3. 반복 실행: 지속적으로 감시하며, 공격이 다시 감지되면 재전환

    Bash 스크립트

    #!/bin/bash

    # 감시할 네트워크 인터페이스 목록 (교차 전환)
    IFACE1="eth0"
    IFACE2="eth1"

    # 패킷 임계값 (초당 패킷 수)
    THRESHOLD=10000

    # 현재 사용 중인 인터페이스 (초기값은 eth0)
    CURRENT_IFACE="$IFACE1"

    # 로그 파일 위치
    LOGFILE="/var/log/ddos_auto_switch.log"

    # DDoS 감지 함수
    detect_ddos() {
    RX1=$(cat /sys/class/net/$CURRENT_IFACE/statistics/rx_packets)
    sleep 1
    RX2=$(cat /sys/class/net/$CURRENT_IFACE/statistics/rx_packets)

    PPS=$((RX2 - RX1))
    echo "$(date) - $CURRENT_IFACE: $PPS PPS" >> "$LOGFILE"

    if (( PPS > THRESHOLD )); then
    return 0 # DDoS 감지됨
    else
    return 1 # 정상 상태
    fi
    }

    # 네트워크 인터페이스 변경 함수
    switch_interface() {
    if [[ "$CURRENT_IFACE" == "$IFACE1" ]]; then
    NEW_IFACE="$IFACE2"
    else
    NEW_IFACE="$IFACE1"
    fi

    echo "$(date) - DDoS 감지됨! $CURRENT_IFACE → $NEW_IFACE 변경" >> "$LOGFILE"

    # 네트워크 인터페이스 변경
    ip link set "$CURRENT_IFACE" down
    ip link set "$NEW_IFACE" up
    ip route replace default dev "$NEW_IFACE"

    # 현재 인터페이스 업데이트
    CURRENT_IFACE="$NEW_IFACE"
    }

    # 메인 루프 (주기적으로 체크)
    while true; do
    if detect_ddos; then
    switch_interface
    sleep 5 # 전환 후 안정화 대기
    else
    sleep 1 # 정상 상태면 계속 감시
    fi
    done

    사용 방법

    1. 스크립트 저장 nano /usr/local/bin/ddos_auto_switch.sh 위 코드를 붙여넣고 저장합니다.
    2. 실행 권한 부여 chmod +x /usr/local/bin/ddos_auto_switch.sh
    3. 백그라운드 실행 nohup /usr/local/bin/ddos_auto_switch.sh &
    4. 로그 확인 tail -f /var/log/ddos_auto_switch.log

    작동 방식

    • eth0에서 DDoS 감지 → eth1로 전환
    • 다시 eth1에서 DDoS 감지 → eth0으로 전환
    • 공격이 계속되면 계속 전환됨

    2. systemd 서비스 파일 생성

    이제 systemd 서비스 파일을 생성하여 자동 실행되도록 설정합니다.

    sudo nano /etc/systemd/system/ddos_auto_switch.service

    아래 내용을 입력 후 저장 (Ctrl + X, Y, Enter) 합니다.

    [Unit]
    Description=DDoS Auto Ethernet Switch Service
    After=network.target

    [Service]
    ExecStart=/usr/local/bin/ddos_auto_switch.sh
    Restart=always
    User=root

    [Install]
    WantedBy=multi-user.target

    3. 서비스 활성화 및 실행

    (1) systemd 서비스 리로드

    sudo systemctl daemon-reload

    (2) 서비스 활성화 (부팅 시 자동 실행)

    sudo systemctl enable ddos_auto_switch.service

    (3) 서비스 즉시 실행

    sudo systemctl start ddos_auto_switch.service

    (4) 서비스 상태 확인

    sudo systemctl status ddos_auto_switch.service

    (5) 서비스 로그 확인

    journalctl -u ddos_auto_switch.service -f

    4. 서비스 중지 및 제거 (필요 시)

    (1) 서비스 중지

    sudo systemctl stop ddos_auto_switch.service

    (2) 부팅 시 자동 실행 해제

    sudo systemctl disable ddos_auto_switch.service

    (3) 서비스 삭제

    sudo rm /etc/systemd/system/ddos_auto_switch.service
    sudo systemctl daemon-reload

    ✅ 이제 서버가 부팅될 때 자동으로 DDoS 감지 및 네트워크 인터페이스 전환이 동작합니다. 🚀

  • Rust 플러그인 특정 시간마다 “공지사항”을 출력하는방법

    📌 기본 Rust Oxide 플러그인 코드

    아래 코드는 매 5분마다 “공지사항”을 출력하는 예제야.

    📜 AutoNotice.cs

    using Oxide.Core.Plugins;
    using System.Collections.Generic;

    namespace Oxide.Plugins
    {
    [Info("AutoNotice", "YourName", "1.0.0")]
    [Description("특정 시간마다 공지사항을 출력하는 플러그인")]

    public class AutoNotice : CovalencePlugin
    {
    private const float NoticeInterval = 300f; // 5분 (초 단위)
    private List<string> messages = new List<string>
    {
    "📢 서버 공지: 공지를 확인하세요!",
    "💡 팁: '/info' 명령어를 입력하면 도움말을 볼 수 있습니다.",
    "🚀 이벤트 진행 중! 자세한 사항은 Discord를 확인하세요."
    };
    private int currentMessageIndex = 0;

    private void OnServerInitialized()
    {
    timer.Every(NoticeInterval, SendNotice);
    Puts("AutoNotice 플러그인이 활성화되었습니다!");
    }

    private void SendNotice()
    {
    if (messages.Count == 0) return;

    string message = messages[currentMessageIndex];
    server.Broadcast(message);

    currentMessageIndex = (currentMessageIndex + 1) % messages.Count;
    }
    }
    }

    📌 설명

    1. 타이머 설정 (timer.Every)
      • NoticeInterval 값(300초 = 5분)마다 SendNotice() 함수를 실행.
    2. 공지사항 출력 (server.Broadcast)
      • 모든 플레이어에게 채팅 메시지를 전송.
      • messages 리스트를 이용해 여러 메시지를 순환 출력.
    3. 메시지 변경
      • messages 리스트에 추가하면 여러 공지를 번갈아 출력 가능.

    📌 플러그인 설치 방법

    1. 위 코드를 AutoNotice.cs로 저장.
    2. Rust 서버의 oxide/plugins/ 폴더에 업로드.
    3. 서버를 재시작하거나 oxide.reload AutoNotice 실행.