- 论坛徽章:
- 0
|
回来准备发新帖才发现自己以前的求助帖还没有close。
自己做下总结,对于sshpass使用while循环执行只运行一行的情况,可以使用for循环规避,当初如何测试的现在已经记不清了。
直接上脚本吧。- # /bin/bash
- ######################################################
- #Description:
- # this script modity file /etc/sudoers
- #Author:
- #Date: 2016-5-9
- #Verison: 1.0
- #Processname: chsudoers.sh
- ######################################################
- export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
- # check input paramters
- if [ $# -ne 1 ]; then
- echo "sh `basename $0` file"; exit 1
- fi
- FILE_NAME=$1
- LOG_NAME=change_sudoers_log.txt
- Date=$(date +%Y%m%d)
- SSHPASS=`which sshpass`
- #exec_cmd="cp -a /etc/sudoers /etc/sudoers.${Date}; sed -i '/LOGVIEWER =/ s@\$@&, /bin/netstat@' /etc/sudoers"
- exec_cmd="cp -a /etc/sudoers /etc/sudoers.${Date}"
- thead_num=50
- tmp_fifo_file=/tmp/$.fifo
- mkfifo $tmp_fifo_file
- exec 9<>$tmp_fifo_file
- rm -f $tmp_fifo_file
- # exec_ssh(passwd, host, exec_cmd)
- function exec_ssh() {
- $SSHPASS -p "$1" ssh -o StrictHostKeyChecking=no root@$2 "$3"
- }
- # exec_scp(passwd, local_file, host, remote_dir/file)
- function exec_scp() {
- $SSHPASS -p "$1" scp -o StrictHostKeyChecking=no $2 root@$3:$4
- if [ $? -eq 0 ]; then
- echo "auto_scp device $3 step 1; upload $2 to $4 success!" | tee -a $LOG_NAME
- else
- echo "auto_scp device $3 step 1; upload $2 to $4 failed!" | tee -a $LOG_NAME
- fi
- }
- # check_ping(host)
- function check_ping() {
- ping $1 -c 2 -w 2 > /dev/mull
- if [ $? -ne 0 ]; then
- echo "HOST:$1 connection failed!" | tee -a $LOG_NAME
- continue
- fi
- }
- for ((i=0; i<$thead_num; i++)); do
- echo
- done >&9
- # exclude while execution
- IFS=\n'
- for line in `cat $FILE_NAME`; do
- remote_ip=$(echo $line | awk '{print $1}')
- pass=$(echo $line | awk '{print $2}')
- read -u9
- {
- check_ping $remote_ip
- os_ver=$(exec_ssh $pass $remote_ip uname)
- if [ "$os_ver" = "Linux" ]; then
- exec_ssh $pass $remote_ip $exec_cmd
- exec_scp $pass ./sudoers.default $remote_ip /etc/sudoers
- else
- echo "HOST:$remote_ip non [Linux] system!" | tee -a $LOG_NAME
- fi
- sleep 2
- echo >&9
- } &
- done
- wait
- exec 9>&-
- exit 0
复制代码 |
|