• [转载]expect spawn、linux expect 用法小记


    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
      脚本代码如下:
      ##############################################
      #!/usr/bin/expect
      set timeout 30
      spawn ssh -l username 192.168.1.1
      expect "password:"
      send "ispassr"
      interact
      ##############################################
      1. [#!/usr/bin/expect]
      这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
      注意:这一行需要在脚本的第一行。
      2. [set timeout 30]
      基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
      3. [spawn ssh -l username 192.168.1.1]
       spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
      它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
      4. [expect "password:"]
       这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命 令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
      5. [send "ispassr"]
      这里就是执行交互动作,与手工输入密码的动作等效。
      温馨提示: 命令字符串结尾别忘记加上“r”,如果出现异常等待的状态可以核查一下。
      6. [interact]
      执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
      #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下
      # Change a login shell to bash
      set user [lindex $argv 0]
      spawn bash $user
      expect "]:"
      send "/bin/bash "
      expect eof
      exit

    使用expect实现ssh自动输入密码,从而自动登陆Linux

    用以下命令执行: 

    expect -f expect-ssh.exp <username> <password> <hostname or ip> 

    注意,在这个expect-ssh.exp中,connect函数主要负责登陆,代码的最后两行,两个send是登陆上去后,执行的命令,注意最后一定要执行一个exit,否则会导致expect执行完成后还留在远程主机上。 

    这里是expect-ssh.exp的源码: 

    proc usage {} {
        puts stderr 
    "usage: $::argv0 username password ipaddress"
        
    exit 1
    }

    proc 
    connect {pass} {
       expect {
           
    "(yes/no)?" {
               
    send "yesn"
               expect 
    "*password:" {
                    
    send "$passn"
                    expect {
                        
    "*#" {
                            
    return 0
                        }
                    }
               }
           }
           
    "*password:" {
               
    send "$passn"
               expect {
                   
    "*#" {
                       
    return 0
                   }
               }
           }
       }
       
    return 1
    }

    if {$argc != 3} { usage }

    set username [lindex 
    $argv 0]
    set password [lindex 
    $argv 1]
    set hostip [lindex 
    $argv 2]

    spawn ssh ${username}@${hostip}

    if {[connect $password]} {
        
    exit 1
    }

    send "rm -f /root/testeric;rm -f pattern_filen"
    send "exitn"
    expect 
    eof
    [转载]expect spawn、linux expect 用法小记
     
     
     
     
     
     
     
     
    ################################################################
    宗上所述,其实最简单的还是。这个做法:
      链接:http://blog.163.com/luojianlin_622/blog/static/271166402009871414258/
    内容如下:

    linux下ssh自动登录的脚本  

    2009-09-07 13:41:42|  分类: 默认分类 |字号 订阅

     

    linux下ssh自动登录的脚本
    由于每次都要从中转的Linux服务器上链接到其它Linux服务器,
    每次都需要输入长串的ssh命令。并且还要重复输入密码,很繁琐。因此整理脚本,简化为每次只要输入主机

    名,即可自动登录
    1.最简单的省略用户名和主机名的做法
    alias mq=’ssh -llizongbo -p13800 ‘
    这样,输入 mq 618119.com即为: ssh -llizongbo -p13800 618119.com
    解决了每次需要输入lizongbo的繁琐。但是并没有解决每次需要输入密码的繁琐
    2.改进,需要解决输入密码的问题
    编写 mssh.sh脚本,内容如下:

    view plaincopy to clipboardprint?

    #!/usr/bin/expect -f
    #auto ssh login
    set timeout 30
    set sshhost [lindex $argv 0]
    spawn ssh -llizongbo -p13800 $sshhost
    expect “password:”
    send “lizongbo_618119 ”
    interact

    给文件加上可执行权限: chmod +x ./mssh.sh
    如果文件默认有其它权限,建议最好设置为只能自己读取,修改和执行
    chmod 700 ./mssh.sh
    测试成功:
    ./mssh.sh 618119.com
    直接登录到了 618119.com
     
    还可以参考这个链接的内容:
     
    剩下的去执行什么命令,这就要靠bash脚本自己了。呵呵,你懂得。我喜欢把所有的命令写成一行,嘿嘿~钟爱 | 管道与 && 哈哈
  • 相关阅读:
    with
    网编
    选课新系统大作业
    网络编程

    知识点
    Python
    学生选课大作业
    理解position与anchorPoint[转]
    毛玻璃效果的简单使用
  • 原文地址:https://www.cnblogs.com/spaceship9/p/3172937.html
Copyright © 2020-2023  润新知