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\r" - exit命令:会退出root账号,成为普通用户
spawn su - root
expect "密码:"
send "zlkj\r"
send "pwd\r"
#send "exit\r"
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下,执行命令

expect脚本自动获取root权限的更多相关文章

  1. Ubuntu获取root 权限,开机自动登入root

    新机器获取root权限,只需要给root 增加密码: sudo passwd root 修改开机自动登入: #sudo gedit /etc/lightdm/lightdm.conf 修改参数: au ...

  2. [Android Pro] Android fastboot刷机和获取Root权限

    参考文章: https://developers.google.com/android/nexus/images 转载自:    http://www.inexus.co/article-1280-1 ...

  3. Linux基本常用命令|ubuntu获取root权限

    我用的是ubuntu12.4系统,因为默认是没有获取root的权限的 下边讲解怎么获取root权限 在终端中输入: sudo passwd root Enter new UNIX password: ...

  4. 华为U8810的用户如何获取ROOT权限详细教程

    由于在论坛里看到有人在找这个手机的详细的root教程,所以刷机啦小编在这里整理了一下方便新手来操作,其实这个手机root起来还是蛮简单的,只需要一个root软件就可以了,相当于一键root了,在这里整 ...

  5. Genymotion刷入谷歌应用市场以及获取root权限

    Genymotion刷入谷歌应用市场以及获取root权限 - 推酷http://www.tuicool.com/articles/rEV3aa6 刷入gapp, arm框架,supersu的包要注意, ...

  6. android中获取root权限的方法以及原理(转)

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. 二. Root 的介绍 1. Root 的目的 可以让我们拥有 ...

  7. Android 获取ROOT权限原理解析

    一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android玩家中常说的“越狱”有一个更深层次的认识. 二. Root的介绍 1.       Root 的目的 可以让 ...

  8. Android 上SuperUser获取ROOT权限原理解析

    Android 上SuperUser获取ROOT权限原理解析 一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. ...

  9. 获取root权限及破解原理分析

    2012-03-18 17:58:45|  分类: android |字号 订阅 如今Android系统的root破解基本上成为大家的必备技能!网上也有非常多中一键破解的软件,使root破解越来越ea ...

随机推荐

  1. MSSQL 生成唯一自增数据的办法

    我的应用场景是多进程并发获取这个计数,且要保证唯一且自增,我用的办法是锁表 计数表Counter,就一行数据 下面是存储过程 create procedure [dbo].[GetCount] AS ...

  2. NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)

    问题: 如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性? 数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5 ...

  3. Width Height -- (1)

    Width和Height应该是我们学习CSS时,最先接触到的属性了,一宽一高. 我们知道页面当中的标签分为块级元素和行内元素,它们最大的区别就在于,块级元素可以设置宽高,行内元素不能设置宽高. 举例说 ...

  4. 解决 new file()在IOS下不兼容 的问题

    最近 做项目,做的要是拍照后上传相片,以file格式上传..所以 拍照 后用canvas生成base64格式再转file..在PC和安卓都是没有问题,到IOS上面不行..new file后就是生成一个 ...

  5. c# datagridview导出Excel文件 问题

    今天vs2010c#开发做datagridview导出Excel文件时,发现一个问题,和大家探讨一下: 第一种方式:写流的方式 private void button_Excel_Click(obje ...

  6. Redis 分布式锁的正确打开方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  7. 关于如何修改一张表中所有行与选定字段的同sql多行语句的添加方法

    利用Excel以及word文档进行操作 将表的字段以及数据全部放入Excel表中并保存. 在word表中将写好的sql语句放入文档,利用邮件--选择收件人--使用现有列表--(选择之前做好的Excel ...

  8. Centos7 samba配置

    目录 免密码只读 加密码可读写 Samba配置了很多次,总是忘,现在写在博客里. 免密码只读 最主要的是免密配置,主要用到了两个配置,要写在[global]里: map to guest = Bad ...

  9. linux查看磁盘类型(是否SSD盘)

    介绍两种方法: 第一种: cat /sys/block/sda/queue/rotational 注意: 命令中的sba是你的磁盘名称,可以通过df命令查看磁盘,然后修改成你要的 结果: 返回0:SS ...

  10. 利用python制作在线视频播放器遇到的一些问题

    经过前期的调研,我准备使用PyQT+PyAV+PyAudio+pillow.期间也尝试过使用ffmpeg-python,但最后还是选择了av这个更底层,自由度更大的库来完成音视频的处理.   ==== ...