====== Shell szkript felderítő szkript ======
Felderíti a hoszton lévő shell szkripteket, és megmutatja a sha hast-üket, a módosítási dátumukat, meg van-e hívva valakinek a crontab-jából, illetve van-e benne IP cím, email cím, vagy előre definiált parancsok valamelyike.
Paraméterként meg lehet neki adni, hogy mely könyvtárra fusson, egyébként az egész fájlrendszerben keres. Illetve szkript lista fájl is megadható neki paraméterként, akkor az abban felsorolt szkripteket elemzi. Ilyen bemenetet gyárt kimenetként pl a crontab bejegyzésekből az alábbi szkript:
#!/bin/sh
#grep -R ".*" /var/spool/cron/ | sed -e 's/^\/var\/spool\/cron\/crontabs\///' | grep -v ':#' | grep -v '^$' | egrep -v '(errclear|clcycle|dumpcheck|lpar2rrd|pmcfg|motd|mkpasswd|logrotate|dumpctrl|sa1|sa2|Internal-Function|======|at.allow)'
find /var/spool/cron/ -type f | xargs -I{} cat {} | grep -v '^#' | grep -v '^$' | egrep -v '(errclear|clcycle|dumpcheck|lpar2rrd|pmcfg|motd|mkpasswd|logrotate|dumpctrl|sa1|sa2|Internal-Function|======|at.allow)' | sed -e 's/^[^/$]*//' -e 's/[ >].*$//' | sort | uniq | while read SOR; do
if echo $SOR | egrep -s '^\$'; then
VARIABLE=$(echo $SOR | sed 's/^.*\(\$[a-zA-Z0-9_]*\)[^a-zA-Z0-9_].*$/\1/')
USER=$(grep -R "$SOR" /var/spool/cron/ | sed 's/^.*\/\([a-z]*\):.*/\1/')
HOME=$(lsuser -a home $USER | awk -F'=' '{print $2}' | sed 's/\//\\\//g')
echo "$SOR" | sed "s/$VARIABLE/$HOME/"
fi
echo $SOR
done
#!/bin/ksh
COMMAND_LIST="ssh ftp sftp rsh rdist rsync scp dsh rdsh mail sqlplus mutt"
TMPFILE="/tmp/find_shell_scripts.sh.tmp"
CSVFILE=$(hostname)_script_catalog.out
>$CSVFILE
if [[ -d $1 ]]; then
STARTDIR="$1"
elif [[ -f $1 ]]; then
FILE_LISTA="$1"
else
STARTDIR='/'
fi
echo "FILE NAME;MTIME;CRONTAB;IPS;COMMANDS;EMAILS" | awk -F';' '{printf "%-60s %-21s %-15s %-20s %-20s %-30s\n",$1,$2,$3,$4,$5,$6}'
echo "FILE NAME;MTIME;CRONTAB;IPS;COMMANDS;EMAILS;SHASUM" | awk -F';' '{printf "%-60s;%-21s;%-15s;%-20s;%-20s;%-30s;%-41s\n",$1,$2,$3,$4,$5,$6,$7}' >> $CSVFILE
if [[ -n $FILE_LISTA ]]; then
cat $FILE_LISTA > $TMPFILE
else
find $STARTDIR -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) > $TMPFILE
fi
cat $TMPFILE | grep -v '^$' | while read FILE; do
if [[ -f $FILE ]]; then
if [[ $(file $FILE | egrep -c '(: shell script|: commands text)') -eq 1 || -n $FILE_LISTA ]]; then
MTIME=$(istat $FILE | awk -F' ' '/Last modified/{print $8"."$4"."$5"-"$6}')
CRONTABS=$(grep -R "$FILE" /var/spool/cron/ | while read SOR; do
echo "$SOR" | awk -F':' '{print $1}' | awk -F'/' '{print $NF}';
done | sort | uniq | tr '\n' ',' | sed -e 's/^/crontab:/' -e 's/,*$//')
ATJOBS=$(grep -R "$FILE" /var/spool/atjobs/ | while read SOR; do
echo "$SOR" | awk -F':' '{print $1}' | awk -F'/' '{print $NF}';
done | sort | uniq | tr '\n' ',' | sed -e 's/^/atjobs:/' -e 's/,*$//')
if [[ -n $CRONTABS && -n $ATJOBS ]]; then CRONTABS="$CRONTABS,$ATJOBS"; fi
IPS=$(egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" "$FILE" | while read SOR; do
echo "$SOR" | perl -wne'while(/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/g){print "$&\n"}'
done | sort | uniq | tr '\n' ',' | sed -e 's/^/ips:/' -e 's/,*$//')
EMAILS=$(egrep "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}" "$FILE" | while read SOR; do
echo "$SOR" | perl -wne'while(/[\w\.\-]+@[\w\.\-]+\w+/g){print "$&\n"}'
done | sort | uniq | tr '\n' ',' | sed -e 's/^/emails:/' -e 's/,*$//')
COMMANDS=$(for COMMAND in $COMMAND_LIST; do
if [[ $(grep -c "$COMMAND" $FILE) -gt 0 ]]; then
echo "$COMMAND"
fi
done | sort | uniq | tr '\n' ',' | sed -e 's/^/commands:/' -e 's/,*$//')
echo "$FILE;$MTIME;$CRONTABS;$IPS;$COMMANDS;$EMAILS" | awk -F';' '{printf "%-60s %-21s %-15s %-20s %-20s %-30s\n",$1,$2,$3,$4,$5,$6}'
echo "$FILE;$MTIME;$CRONTABS;$IPS;$COMMANDS;$EMAILS;$(shasum $FILE | awk '{print $1}')" | awk -F';' '{printf "%-60s;%-21s;%-15s;%-20s;%-20s;%-30s;%-41s\n",$1,$2,$3,$4,$5,$6,$7}' | sed -e 's/crontab://' -e 's/emails://' -e 's/commands://' -e 's/ips://' -e 's/atjobs://' >> $CSVFILE
fi
else
echo "$FILE;Nem nyithato meg a fajl." | awk -F';' '{printf "%-60s %-41s\n",$1,$2}'
echo "$FILE;Nem nyithato meg a fajl." | awk -F';' '{printf "%-60s;%-41s\n",$1,$2}' >> $CSVFILE
fi
done
rm -f $TMPFILE