• expect脚本自动获取root权限


    Linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp、文件传输sftp等。这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的。为了实现自动化远程操作,我们可以借用expect的功能。

    expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。expect需要Tcl编程语言的支持,要在系统上运行expect必须首先安装Tcl。


    一、Tcl 安装

    主页: http://www.tcl.tk

    下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml

    (1)下载源码包

    wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
    

    (2)解压缩源码包

    tar xfvz tcl8.4.11-src.tar.gz
    

    (3)安装配置

    cd tcl8.4.11/unix
    ./configure --prefix=/usr/tcl --enable-shared 
    make
    sudo make install
    

    (4)后续

    安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。

    注意:暂时不要删除tcl源代码,因为expect的安装过程还需要用。


    运行configure报错

    上面在运行configure这一步会报错:

    $ ./configure --prefix=/usr/tcl --enable-shared
    ...
    checking system version (for dynamic loading)... ./configure: 1: ./configure: Syntax error: Unterminated quoted string
    

    这是是configure文件里的一行字符串引号配对错误引起的,搜索"/etc/.relid"查找到该行:

    system=MP-RAS-`awk '{print }' /etc/.relid'`
    

    处理方式是去掉倒数第2个那个多出来的下引号,本以为去掉之后可以直接执行完,没想到又有一个错误:

    checking FIONBIO vs. O_NONBLOCK for nonblocking I/O... ./configure: 1: ./configure: Syntax error: Unterminated quoted string
    

    还是引号配对错误引起的错误,于是又搜索"/etc/.relid"查找到该行:

    system=MP-RAS-`awk '{print }' /etc/.relid‘`
    

    处理方式依旧是去掉多出来的下引号,然后再重新configure就可以了。


    二、expect 安装 (需Tcl的库)

    主页: http://expect.nist.gov/

    (1)下载源码包

    wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
    

    (2)解压缩源码包

    tar xzvf download
    

    注意:下载的是download这个压缩包,而不是expect5.45.tar.gz。

    (3)安装配置

    cd expect5.45 
    ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic
    make
    sudo make install
    ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
    

    三、expect 脚本命令

    expect的核心是spawn、expect、send、set。


    spawn 调用要执行的命令

    • expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:
    • send 发送需要交互的值,替代了用户手动输入内容
    • set 设置变量值
    • interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
    • expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

    expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。


    其他设置

    • 设置expect永不超时 set timeout -1
    • 设置expect 300秒超时,如果超过300没有expect内容出现,则退出 set timeout 300

    expect编写语法

    expect使用的是tcl语法

    • 一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数
      cmd arg arg arg
    • $符号代表变量的值. 在本例中, 变量名称是foo.
      $foo
    • 方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号
      [cmd arg]
    • 双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释
      "some stuff"
    • 大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释
      {some stuff}
    • 反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭"$"符号, 引号,方括号和大括号的特殊含义

    四、expect脚本自动获取root权限

    运行下面的expect脚本,可以在不手动输入密码的情况下,自动获取root权限:

    #!/usr/expect/bin/expect -f
    
    set timeout=5 #设置5秒超时
    #下面几行后面不能添加注释,否则会异常
    #send "exit
    " - exit命令:会退出root账号,成为普通用户
    spawn su - root
    expect "密码:"
    send "zlkj
    "
    send "pwd
    "
    #send "exit
    "
    interact #使用interact后,脚本将退出到root账号下,可以手动执行root权限的命令
    exit 0 #退出脚本
    

    运行脚本,效果如下:

    zlkj@zlkj:~$ ./test.sh
    spawn su - root
    密码: 
    root@zlkj:~# pwd
    /root
    root@zlkj:~# 
    

    可以看到,在退出脚本后,切换到了root用户。


    Syntax error: Untermin

    利用expect命令实现Shell自动化交互的方法详解

    expect 普通用户自动输入密码到root下,执行命令


  • 相关阅读:
    JVM基础(一)—— 运行时内存结构
    SQL if 和 case when查询示例
    SQL分组聚合查询
    My music
    DataX增量同步到ADB ADS时报错
    shell find的用法
    pycharm安装
    在两个库中查找出差异明细
    docker下安装centos
    升级RDS8.0遇到的问题
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11127787.html
Copyright © 2020-2023  润新知