This is a script I wrote for work to look through a number of remote servers via ssh (shared keys or include a .pem (id_rsa) file to compare a paths and all it’s subfolders.
The result is a report of which files are out of synch and if duplicates found they are listed separately.
#!/bin/bash
## Parameters sync_check [-i id.pem] [-u <user for ssh>] -p <path_to_diff> <target-system-IP1> <target-system-IP2> ...
# David Saliba [dx@sudoall.com]
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
PEMFILE=""
SSH_USER="root"
function usage {
echo
echo -e "\t$0 usage as follows :"
echo -e "\t$0 [-i <pem_file>] [-u <ssh_user_name>] -p <path_to_diff> <ref-system-IPADDR1> <target-system-IP1> <target-system-IP2>..."
echo
}
[ $# -le 2 ] && echo && echo -e "${RED}Incorrect number of parameters ${NC}" && usage && exit 128
while getopts "i:u:p:" opt; do
echo $opt $OPTARG
case $opt in
i ) PEMFILE=$OPTARG; shift $((OPTIND-1)); OPTIND=1 ;
if [[ -f "$PEMFILE" ]]; then
PEMFILE="-i ""$PEMFILE"
else
echo "Pemfile : $PEMFILE not found. Quitting .. "
exit 1
fi
;;
u ) SSH_USER=$OPTARG ; shift $((OPTIND-1)); OPTIND=1 ;;
p ) PATH_TO_CHECK=$OPTARG ; shift $((OPTIND-1)); OPTIND=1 ;;
* ) usage
exit 128
esac
done
extfile="_target.md5.sync_check"
echo; echo
rm -f /tmp/*.sync_check
for i in $* ; do
ipcalc -cs $i
if [ $? == 0 ] ; then
echo -n "Retrieving Signature List from .. :[$i] : "
ssh $PEMFILE $SSH_USER@$i "hostname"
COMMAND="ssh $PEMFILE $SSH_USER@$i \"find $PATH_TO_CHECK -type f -exec md5sum {} \\; | sed -e 's/^/$i\t/'| sort -k 2 \""
#echo "Running : $COMMAND /tmp/$i""_target.md5.sync_check"
bash -c "$COMMAND" > /tmp/$i$extfile
else
echo "Parameter $i not a valid IP skipping .."
fi
done
echo ;echo; echo "Comparing data ... "; echo
OLDIFS=$IFS;
IFS=$'\n';
for i in `cat /tmp/*.sync_check | sort -k3 | uniq -f 1 -c | sort | egrep -v "^[\ \t]*$#" | sort -k4 ` ;do
NUMBER_OF_HITS=`echo "$i" | awk '{print ($1)}'`
echo $i
if [ $NUMBER_OF_HITS -gt 1 ] ; then
MD5Onward=`echo "$i" | awk '{print substr($0, index($0,$3))}'`
echo -e -n "${YELLOW}"
grep -h "$MD5Onward" /tmp/*.sync_check | awk '{print "\t\t",NR, $0}'
echo -e -n "${NC}"
fi
done ;
IFS=$OLDIFS
echo
echo
link to file here: http://jist.sudoall.com/sync_check/sync_check.sh
nJoy 😉
