自动化信任机制脚本

来源:互联网 发布:java求1到200内的素数 编辑:程序博客网 时间:2024/05/16 14:59
#!/bin/sh


################################################################################################################
### makedate:2011-09-09                                                                                      ###
### Licensed Materials - Property of vsyour Technologies Co., Ltd.                                           ###
### http://eggic.com                                                                                         ###
### admin@eggic.com                                                                                          ###
### release 1.0                                                                                              ###
### Copyright 2010-2012 Support Engineers.                                                                   ###
### All rights reserved.                                                                                     ###
###建立:                                                                                                    ###
###user:vsyour                                                                                               ###
###ATCAX86_F0S0:172.16.128.0                                                                                ###
###ATCAX86_F0S1:172.16.128.8                                                                                ###
###                                                                                                          ###
###步骤:                                                                                                    ###
###1、在自己单板生成密钥。                                                                                   ###
###ssh-keygen -t dsa -N "" -f /home/vsyour/.ssh/id_dsa                                                       ###
###2、把自己的公钥拷到对方单板。(可以不用密码连到对方了)                                                   ###
###scp /home/vsyour/.ssh/id_dsa.pub 172.16.128.0:/home/vsyour/.ssh/authorized_keys2                          ###
###3、连到对方单板生成密钥。                                                                                 ###
###ssh 172.16.128.0 "ssh-keygen -t dsa -N \"\" -f /home/vsyour/.ssh/id_dsa"                                  ###
###4、把对方单板的公钥拷回来。                                                                               ###
###scp 172.16.128.0:/home/vsyour/.ssh/id_dsa.pub /home/vsyour/.ssh/authorized_keys2                          ###
###                                                                                                          ###
###考虑到的问题:                                                                                            ###
###1、root用户目录生成KEY的目录与普通用户不一样。                                                            ###
###2、当前用户如果是root用户,则需切换到要生成的用户进行密钥生成。                                           ###
###3、生成时一些需要交互的情况                                                                               ###
###4、拷文件到对方单板时如果对方没有.ssh目录,必须先成生一个。这个问题可以先交互连过去生成一下对方的密钥。   ###
###5、如果用户不相同的情况下,需要在scp文件时增加一个用户名,否则拷不过去                                    ###
###使用方法:fast_trust.sh 本地用户名 远程用户名 远程密码 远程ip                                             ###
###      如:fast_trust.sh vsyour vsyour vsyour 172.16.128.0                                                 ###
###         注意:如果远程用户名与本地不相同测试连接时需要增加一个用户名如ssh vsyour1@172.16.128.0           ###
################################################################################################################






######################################################################
#
#   FUNCTION   : usage
#   DESCRIPTION: 打印帮助信息
#   CALLS      : NA
#   CALLED BY  : NA
#   INPUT      : 参数1: 无
#   OUTPUT     : NA
#   USE GLOBVAR: NA
#   RETURN     : 0: 成功
#   OTHERS     : 从该函数不可以退出脚本
#
######################################################################
function usage ()
{
    # 打印帮助信息,但不退出
    echo "\
Usage:  ./${FBS_SH_NAME}.sh  <local user> <remote user> <remote password> <remote ip>


Arguments:
    <local user>         local user
    <remote user>        remote user
    <remote password>    user's password 
    <remote ip>          IP address
";
    
    return 0;
}


#生成KEY函数,传用户名进来并按用户生成密钥。此函数仅生成本地的key
#make_local_key ${local_user} >/dev/null 2>&1;
function make_local_key()
{
#echo "222222222222222222"
#先判断传进来的用户是不是root用户。如果不是root则把双机信任文件生成到home目录下
if [ ${1} == "root" ];then
   local_key_path=/root/.ssh/id_dsa
 else
   local_key_path=/home/${1}/.ssh/id_dsa
fi


echo "${1}................................"

#判断本地的当前用户是不是与传过来的用户相同,如果相同则不切换生成。
if [ `whoami` == ${1} ];then    
/usr/bin/expect <<EOF
  spawn ssh-keygen -t dsa -N "" -f ${local_key_path}
  set timeout 3
  expect "*Overwrite*" { send "y\n" }
  expect "*fingerprint*" { exit 0 }
  expect eof             { exit 0 }
EOF


else    


/usr/bin/expect <<EOG
  spawn su - ${1} -c "ssh-keygen -t dsa -N \"\" -f ${local_key_path}"
  set timeout 3
  expect "*Overwrite*" { send "y\n" }
  expect "*fingerprint*" { exit 0 }
  expect eog             { exit 0 }
EOG


fi
echo "1111111111111111111111111"

}


#-----------------------------------------------------------------------
#        
# make_remote_key生成远程密钥
#-----------------------------------------------------------------------
#make_remote_key ${remote_ip} ${remote_user} ${remote_password} >/dev/null 2>&1;
function make_remote_key()
{


echo "`date +%Y-%m-%d\ %H:%M:%S` Start make_remote_key  ,opt is :$@" >>${LOG} 2>&1;
  #先判断传进来的用户是不是root用户。如果不是root则把双机信任文件生成到home目录下
if [ ${2} == "root" ];then
   remote_key_path=/root/.ssh/id_dsa
 else
   remote_key_path=/home/${2}/.ssh/id_dsa
fi

#连过去把密钥生成一次
  /usr/bin/expect <<EOH
  spawn ssh -q ${2}@${1} "ssh-keygen -t dsa -N \"\" -f ${remote_key_path};echo \"vsyour\""
  set timeout 3
  expect "*yes/n*" { send "yes\n" }
  expect "*Password:*" { send "$3\n" }
  expect "*Overwrite*" { send "y\n" }
  expect "*fingerprint*" { exit 0 }
  expect eoh             { exit 0 }
EOH


}


#-----------------------------------------------------------------------
#        
# copy_key 复制钥密
#-----------------------------------------------------------------------
#copy_key ${local_user} ${remote_ip} ${remote_user} ${remote_password} >/dev/null 2>&1;
function copy_key()
{

echo "`date +%Y-%m-%d\ %H:%M:%S` Start copy_key  ,opt is :$@" >>${LOG} 2>&1;


#算出远程路径
if [ ${3} == "root" ];then
 remote_key_path=/root/.ssh/id_dsa >>${LOG} 2>&1;
  else
 remote_key_path=/home/${3}/.ssh/id_dsa >>${LOG} 2>&1;
fi




#先判断传进来的用户是不是root用户。如果不是root则把双机信任文件生成到home目录下
if [ ${1} == "root" ];then
    local_key_path=/root/.ssh/id_dsa >>${LOG} 2>&1;
  else
    local_key_path=/home/${1}/.ssh/id_dsa >>${LOG} 2>&1;
fi


#把自己的key拷到对方单板
tmp_path=`dirname ${remote_key_path}`/authorized_keys2
  /usr/bin/expect <<EOI
  spawn scp ${local_key_path}.pub ${3}@${2}:${tmp_path}
  set timeout 3
  expect "*yes/n*" { send "yes\n" }
  expect "*Password:*" { send "$4\n" }
  expect "*Overwrite*" { send "y\n" }
  expect "*fingerprint*" { exit 0 }
  expect eoi             { exit 0 }
EOI


#把对方单板的KEY拷回来
tmp_path=`dirname ${local_key_path}`/authorized_keys2
  /usr/bin/expect <<EOK
  spawn su - ${1} -c "scp ${3}@${2}:${remote_key_path}.pub ${tmp_path}"
  set timeout 3
  expect "*yes/n*" { send "yes\n" }
  expect "*Password:*" { send "$4\n" }
  expect "*Overwrite*" { send "y\n" }
  expect "*fingerprint*" { exit 0 }
  expect eok             { exit 0 }
EOK


}
#ssh本机ip也通过验证,取消输入yes的功能
#!/bin/sh
function ssh_self_key()
{
#set -x
if [ ${1} == "root" ];then
    home=${1}
else
    home="home/"${1}
fi
/usr/bin/expect <<EOH
spawn ssh ${1}@${3} "cat /${home}/.ssh/id_dsa.pub >> /${home}/.ssh/authorized_keys2"
set timeout 3
expect "*yes/n*" { send "yes\n" }
expect "*Password:*" { send "$2\n" }
expect "*Overwrite*" { send "y\n" }
expect "*fingerprint*" { exit 0 }
expect "*fingerprint*" { exit 0 }
expect eoh             { exit 0 }
EOH
}


function ssh_hostname_key()
{
#set -x


/usr/bin/expect <<EOH
spawn su - ${1} -c "ssh ${1}@${3}"
set timeout 3
expect "*yes/n*" { send "yes\n" }
expect "*Password:*" { send "$2\n" }
expect "*Overwrite*" { send "y\n" }
expect "*fingerprint*" { exit 0 }
expect "*fingerprint*" { exit 0 }
expect eoh             { exit 0 }
EOH
}


function ssh_net_key()
{
    declare FBS_SH_NAME=fast_trust
    declare local_user=${1:-root} #要创建本地哪个用户与对方的双机信任关系。如果为空默认为root 
    declare remote_user=${2:-root} #远程需要建立双机信任的用户,默认为root                      
    declare remote_password=${3:-huawei}   #远程用户的密码                                                        
    declare remote_ip=${4} #远程需要建立双机信任的ip地址                                                 
    declare LOG=./trust_vsyour.log
    echo "${local_user} ${remote_user} ${remote_password} ${remote_ip}..............................."
    # 设置打印元素,颜色、格式等
    # 使用说明:使用printf或者echo “<颜色/格式><字符串><FBS_CLOSED>”
    declare FBS_ESC=`echo -en "\033"`;
    declare FBS_EXTD="${FBS_ESC}[1m";


    declare FBS_WARN="${FBS_ESC}[1;31m";    # warning,红色
    declare FBS_DONE="${FBS_ESC}[1;32m";    # done,绿色
    declare FBS_ATTN="${FBS_ESC}[1;33m";    # attention,黄色
    declare FBS_HELP="${FBS_ESC}[1;36m";    # help,高亮明蓝色
    declare FBS_PROMPT="${FBS_ESC}[1;37m";  # prompt,高亮白色
    declare FBS_HEAD="${FBS_ESC}[7;37m";    # head,高亮白色,反显
    declare FBS_CLOSED="${FBS_ESC}[0m";     # 颜色设置结束符号
    declare FBS_NORM=`echo -en "${FBS_ESC}[m\017"`
    declare FBS_STAT=`echo -en "\015${FBS_ESC}[${COLUMNS}C${FBS_ESC}[10D"` 


    # 参数(2): 大小,以K为单位,默认为1M
    declare -i l_logSize=1024;


    #先判断日志文件是否存在,再取日志的大小,
    #如果大于1G就检测日志备份文件是否存在,
    #如果存在就把备份删掉再改名成日志备份名字。
    #否则把日志直接改名。
    if [ -f ${LOG} ];then
        logsum=`du -sk ${LOG} |awk '{print $1}'`
        #1M后把日制备份
        if [ "${logsum}" -gt "${l_logSize}" ];then
            if [ -f ${LOG}_bak ];then
                  rm -rf ${LOG}_bak;
                  mv ${LOG} ${LOG}_bak;
                else
              mv ${LOG} ${LOG}_bak;
          fi
        fi
    fi;


    #-----------------------------------------------------------------------
    #                         Main
    # 正式开始运行脚本
    #-----------------------------------------------------------------------
    if [ $# -le 1 ];then
      usage;
      exit 1;
    fi
        
    echo "`date +%Y-%m-%d\ %H:%M:%S` Start script===================================================" >>${LOG} 2>&1;
    echo "${FBS_DONE}`date +%Y-%m-%d\ %H:%M:%S` Now Start script ${FBS_CLOSED}"


    make_local_key ${local_user} >/dev/null 2>&1;
    echo "`date +%Y-%m-%d\ %H:%M:%S` Start make_local_key  ,the result is :$?" >>${LOG} 2>&1;
    echo "${FBS_DONE}`date +%Y-%m-%d\ %H:%M:%S` Now runing make_local_key ${FBS_CLOSED}"


    make_remote_key ${remote_ip} ${remote_user} ${remote_password} >/dev/null 2>&1;
    echo "`date +%Y-%m-%d\ %H:%M:%S` Start make_remote_key  ,the result is :$?" >>${LOG} 2>&1;
    echo "${FBS_DONE}`date +%Y-%m-%d\ %H:%M:%S` Now runing make_remote_key ${FBS_CLOSED}"


    copy_key ${local_user} ${remote_ip} ${remote_user} ${remote_password} >/dev/null 2>&1;
    echo "`date +%Y-%m-%d\ %H:%M:%S` Start copy_key  ,the result is :$?" >>${LOG} 2>&1;
    echo "${FBS_DONE}`date +%Y-%m-%d\ %H:%M:%S` Now runing copy_key ${FBS_CLOSED}"
    
    echo "`date +%Y-%m-%d\ %H:%M:%S` ok The script is run End========================================" >>${LOG} 2>&1;
    echo "${FBS_DONE}`date +%Y-%m-%d\ %H:%M:%S` ok The script is run End${FBS_CLOSED}"


}




function main
{
typeset func_name="main"
param1=`echo $1`

case "${param1}"in  
        ssh_self_key)
            # 自身IP验证ssh信任机制
            ssh_self_key $2 $3 $4
            if [ $? -ne 0 ];then
                return 1
            fi
        ;;
        ssh_hostname_key)
            # 自身hostname验证ssh信任机制
            ssh_hostname_key $2 $3 $4
            if [ $? -ne 0 ];then
                return 1
            fi
        ;;    
        ssh_net_key)
            # 验证对方ip的ssh信任机制
            ssh_net_key $2 $3 $4 $5 
            if [ $? -ne 0 ];then
                return 1
            fi
        ;;
        *)
       echo "error" "${func_name}" " Invalid parameter ${FAILED}!"
       return 1
   ;;  
    esac
}
# end of main


main $@
原创粉丝点击