zoukankan      html  css  js  c++  java
  • linux脚本实现自己主动输入password

    使用Linux的程序猿对输入password这个举动一定不陌生,在Linux下对用户有严格的权限限制,干非常多事情越过了权限就得输入password。比方使用超级用户运行命令,又比方ftp、ssh连接远程主机等等,例如以下图

    http://littlewhite.us/pic/20141110/ssh_login.png

    那么问题来了。在脚本自己主动化运行的时候须要输入password怎么办?比方你的脚本里有一条scp语句。总不能在脚本运行到这一句时手动输入password吧

    针对于ssh或scp命令。可能有人会回答是建立信任关系,关于建立ssh信任关系的方法请自行百度Google。仅仅须要两行简单的命令就可以搞定,但这并非常规的解决方式,假设是ftp连接就没辙了,况且。你不可能为了运行某些命令去给每一个你要连接的主机都手动建立ssh信任。这已经偏离了今天主题的本意。今天要说的是在脚本里自己主动输入password,我们能够想象下,更优雅的方式应该是在脚本里自己配置password。当屏幕交互须要输入时自己主动输入进去,要达到这种效果就须要用到expect

    安装

    CentOS下安装命令非常easy,例如以下

    sudo yum install expect

    至于Mac用户,能够通过homebrew安装(须要先安装homebrew。请自行Google)

    brew install expect

    測试脚本

    我们写一个简单的脚本实现scp复制文件,在脚本里配置password。保存为scp.exp例如以下

    #!/usr/bin/expect
    set timeout 20
    
    if { [llength $argv] < 2} {
        puts "Usage:"
        puts "$argv0 local_file remote_path"
        exit 1
    }
    
    set local_file [lindex $argv 0]
    set remote_path [lindex $argv 1]
    set passwd your_passwd
    
    set passwderror 0
    
    spawn scp $local_file $remote_path
    
    expect {
        "*assword:*" {
            if { $passwderror == 1 } {
            puts "passwd is error"
            exit 2
            }
            set timeout 1000
            set passwderror 1
            send "$passwd
    "
            exp_continue
        }
        "*es/no)?

    *" { send "yes " exp_continue } timeout { puts "connect is timeout" exit 3 } }

    注意,第一行非常重要,通常我们的脚本里第一行是#!/bin/bash,而这里是你机器上expect程序的路径,说明这段脚本是由expect来解释运行的,而不是由bash解释运行。所以代码的语法和shell脚本也是不一样的,当中set passwd your_passwd设置成你自己的password,然后运行例如以下命令

    ./scp.exp ./local_file user@host:/xx/yy/

    运行前确保scp.exp有运行权限,第一个參数为你本地文件。第二个为远程主机的文件夹,运行脚本假设报错“connect is timeout”,能够把超时设长一点。第二行set timeout 20能够设置超时时间。单位是秒。脚本运行效果例如以下

    http://littlewhite.us/pic/20141110/scp_exp.png

    还能做什么

    细心的同学一定发现了,事实上expect提供的是和终端的一种交互机制,输入password仅仅是当中一种应用形式,仅仅要是在终端堵塞须要输入时,都能够通过expect脚本完毕自己主动输入,比方前面脚本里配置了两种交互场景。一种是终端提示"password:"时输入password。另一种是提示"yes/no)?

    "时输入“yes”,假设和远程主机是第一次建立连接。运行scp.exp脚本效果是这种

    http://littlewhite.us/pic/20141110/scp_exp_2.png

    所以我们能够依据终端的提示来配置输入命令。这样就能达到了自己主动化的效果。至于处理其他交互场景,仅仅须要照着上面的脚本依葫芦画瓢即可了

  • 相关阅读:
    使用物化视图的方式进行表级数据同步示例
    【闲谈】我的大学
    firefox的window.onerror没有详细的出错提示
    完全搞懂傅里叶变换和小波(3)——泰勒公式及其证明
    [VC6 console]调用API获取手机归属地
    灰度直方图及处理“cvQueryHistValue_1D”: 找不到标识符”的问题(上)
    【高级】C++中虚函数机制的实现原理
    jquery小例子
    VBA Promming——入门教程
    Wikidata和SparQL简介
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6835385.html
Copyright © 2011-2022 走看看