• Shell登陆远程服务器


      现场服务器较多,密码3个月过期,在到期时需更改密码。

      使用expect编写,尝试登陆2次后退出(防止密码错误时账号锁定),超时重试一次。

      shell脚本调用并定时执行,登陆成功后执行一条命令,如:hostname、uname等,根据退出状态判断密码是否到期。

      0--正常

      1--传入参数错误

      2--timeout

      3--密码错误或到期

      脚本如下: 

    #!/usr/bin/expect
    
    ###############################################################
    # 连接远程主机
    proc do_login {passwd} {
        set timeout 30
        set done 1
        set timeout_case 0
        set ps1 {PS1="doraemon#";export PS1}
        while {$done<3} {
            expect {
                *assword* {
                    send $passwd
                    incr done
                }
                [$%>#] {
                    set done 5
                    send $ps1
    
                    break
                }
                timeout {
                    set done 1
                    switch -- $timeout_case {
                        1 { send_user "try again ...
    " }
                        2 { exit 2
                            expect eof
                        }
                    }
                    incr timeout_case
                }
            }
        }
        if {$done==3} {
            exit 3
            expect eof
        }
    }
    ###############################################################
    # 执行命令
    proc exec_cmd {cmd} {
        expect -re "doraemon#$"
        send_user "$cmd: $cmd
    "
        send $cmd
    }
    ###############################################################
    # 退出
    proc logout {} {
        expect -re "doraemon#$"
        send exit
        expect eof
    }
    ###############################################################
    if {$argc < 4} {
        send_user "Usage:$argv0 user pass ip command
    "
        exit 1
    }
    set user [lindex $argv 0]
    set pass [lindex $argv 1]
    set ip [lindex $argv 2]
    set num 3
    
    spawn ssh -o StrictHostKeyChecking=no -l $user $ip 
    do_login $pass
    while {$num<$argc} {
        set proc [lindex $argv $num]
        # 捕获输出用
        set cmd "echo ==$ip==$user==`$proc`=="
        exec_cmd $cmd
        incr num
    }           
    logout

       测试输出:

    [root@centos1 shcript]# ./logon.expect 
    Usage:./logon.expect user pass ip command
    [root@centos1 shcript]# ./logon.expect root root123 127.0.0.1 hostname
    spawn ssh -o StrictHostKeyChecking=no -l root 127.0.0.1
    root@127.0.0.1's password: 
    Last login: Fri Aug 14 02:54:56 2015 from 127.0.0.1
    [root@centos1 ~]# PS1="doraemon#";export PS1
    doraemon#
    doraemon#$cmd: echo ==127.0.0.1==root==`hostname`==
    echo ==127.0.0.1==root==`hostname`==
    ==127.0.0.1==root==centos1==
    doraemon#exit
    logout
    Connection to 127.0.0.1 closed.
    [root@centos1 shcript]# echo $?
    0
  • 相关阅读:
    ThinkPHP框架 做个简单表单 添加数据例子__ACTION__ __SELF__
    ThinkPHP框架 系统规定的方法查询数据库内容!!同时也支持原生的SQL语句!
    ThinkPHP框架 基础 链接数据库
    ThinkPHP框架 3.2.2 获取系统常量信息 连接数据库 命名空间的理解
    ThinkPHP框架 自定义 Empty 方法保护本地信息不被暴露!!!
    Smarty模板保留缓存
    this指向
    phpcms v9 的表单向导功能的使用方法 附多个案例
    phpcms标签整理_当前栏目调用
    转载]PhpCms V9调用指定栏目子栏目文章的两种方法
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/4545928.html
Copyright © 2020-2023  润新知