0

私はプログラマーでも、セキュリティの専門家でもありません。私は CheckPoint を使用しており、CheckPoint ログ管理で使用するために私が開発した次のコードがあります。

#!/bin/bash -

# Necessario carregar as variaveis do CheckPoint:
. /etc/profile.d/CP.sh

# Description:
# Log management

# Crontab:
#0 */1 * * * nohup /etc/scripts/log start 0<&- 1>> /var/log/LOG 2>&1 &

# Vars:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/etc/scripts
FILE=/var/log/LOG
SLEEP=600
RUN_TIME=01
LOG_DIR=$FWDIR/log
GZIP_RET=1
SCP_RET=1
SCP_USR=openssh
SCP_DEST_DIR=LOGS_RJ
SCP_IP=192.168.1.41
TIME=$(clock | awk {'print $4'} | cut -d ':' -f 1)
CHECK=$(ps aux | grep 'log start' | grep -v grep | wc -l)
DATE=$(date +%y%m%d)

# Functions:

usage() {
    echo "Usage: $0 [start|stop]" >&2
    exit 1
}

do_launch() {
    if [ "$CHECK" -eq 2 ] ; then
        set -x
        #exec >> /var/log/LOG 2>&1
    else
        exit
    fi
}

do_compression() {
    SEARCH=`find "$LOG_DIR" -name '20*' -daystart -follow -mtime +$GZIP_RET | grep -v gz`
    for i in $SEARCH ; do
        gzip -f -9 $i ;
    done
}

do_scp() {
    SEARCH=`find "$LOG_DIR" -name '20*' -daystart -follow -mtime +$SCP_RET`
    for i in $SEARCH ; do
        scp $i $SCP_USR@$SCP_IP:$SCP_DEST_DIR && rm $i || break 1;
    done
}

# Work
if [ "$#" -ne 1 ]
then
    usage
else
    case "$@" in
        start)
            while true ; do
                do_launch
                while true ; do
                    if [ "$TIME" -eq "$RUN_TIME" ] ; then
                        do_scp
                    else
                        do_compression
                    fi
                    sleep $SLEEP
                done
            done
            ;;
        stop)
            pkill -x log
            ;;
        *)
        usage
    esac
fi

exit

手動で実行するとスクリプトは正常に実行されますが、crontab を挿入nohup /etc/scripts/log start 0<&- 1>> /var/log/LOG 2>&1 &するか、ターミナルから実行してログアウトしてログインすると、スクリプトはループ/実行に失敗しますが、ps.

誰かが私を助けることができますか?

また、bashのバージョンはCheckPointより2.05bとなっていますが、マニュアル通りで問題なければバージョンが原因ではないと思います。

4

1 に答える 1

2

ファイルリストの一番上にあることを考えると:

SLEEP=600
RUN_TIME=01
...
TIME=$(clock | awk {'print $4'} | cut -d ':' -f 1)

これは少し驚くべきことです:

if [ "$TIME" -eq "$RUN_TIME" ] ; then

これらの値を変更するものは何もないので、幸運で、clock(私がよく知っているコマンドではありません) からの出力が一致する01か、一致しないかのどちらかです。一致する場合、ループはdo_scpアクションを実行します。それ以外の場合は、do_compressionアクションを実行します。ただし、一度起動すると、他のアクションを実行させるものは何もありません.

修正するには、おそらく反復ごとに TIME を評価する必要があります。また、2 つのアクション間の切り替えを処理するために選択した方法が適切かどうかも考慮する必要があります。怪しいと思います。

于 2012-09-18T18:58:23.637 に答える