shell脚本实现ssh自动登录远程服务器示例:

#!/usr/bin/expect
spawn ssh root@192.168.22.194
expect "*password:"
send "123\r"
expect "*#"
interact

原文链接:http://www.xuanhao360.com/linux-expects/

Expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh登录,ftp登录等都符合交互的定义。下文我们首先提出一个问题,然后介绍基础知四个命令,最后提出解决方法。

问题

如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?


四个命令

Expect中最关键的四个命令是send,expect,spawn,interact。

send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:允许用户交互

1. send命令

send命令接收一个字符串参数,并将该参数发送到进程。

expect1.1> send "hello world\n" hello world

2. expect命令


(1)基础知识

expect命令和send命令正好相反,expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数,也可以接收正则表达式参数。和上文的send命令结合,现在我们可以看一个最简单的交互式的例子:

expect "hi\n"
send "hello there!\n"

这两行代码的意思是:从标准输入中等到hi和换行键后,向标准输出输出hello there。

tips: $expect_out(buffer)存储了所有对expect的输入,<$expect_out(0,string)>存储了匹配到expect参数的输入。

比如如下程序:

expect "hi\n"
send "you typed <$expect_out(buffer)>" send "but I only expected <$expect_out(0,string)>"

当在标准输入中输入

test
hi

是,运行结果如下

you typed: test
hi
I only expect: hi


(2)模式-动作

expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活,下面我们就各种语法分别说明。

单一分支模式语法:

expect "hi" {send "You said hi"}

匹配到hi后,会输出"you said hi"

多分支模式语法:

expect "hi" { send "You said hi\n" } \ "hello" { send "Hello yourself\n" } \ "bye" { send "That was unexpected\n" }

匹配到hi,hello,bye任意一个字符串时,执行相应的输出。等同于如下写法:

expect {
"hi" { send "You said hi\n"} "hello" { send "Hello yourself\n"} "bye" { send "That was unexpected\n"} }


3. spawn命令

上文的所有demo都是和标准输入输出进行交互,但是我们跟希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的。结合上文的send和expect命令我们可以看一下更复杂的程序段了。

set timeout -1
spawn ftp ftp.test.com //打开新的进程,该进程用户连接远程ftp服务器 expect "Name" //进程返回Name时 send "user\r" //向进程输入anonymous\r expect "Password:" //进程返回Password:时 send "123456\r" //向进程输入don@libes.com\r expect "ftp> " //进程返回ftp>时 send "binary\r" //向进程输入binary\r expect "ftp> " //进程返回ftp>时 send "get test.tar.gz\r" //向进程输入get test.tar.gz\r

这段代码的作用是登录到ftp服务器ftp ftp.uu.net上,并以二进制的方式下载服务器上的文件test.tar.gz。程序中有详细的注释。


4.interact

到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是,如何让人在适当的时候干预这个过程了。比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact可以达到这些目的。下面的demo在自动登录ftp后,允许用户交互。

spawn ftp ftp.test.com expect "Name" send "user\r" expect "Password:" send "123456\r" interact


解决方法

上文中提到:

如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?

下面一段脚本实现了从机器A登录到机器B,然后执行机器B上的pwd命令,并停留在B机器上,等待用户交互。具体含义请参考上文。

#!/home/tools/bin/64/expect -fset timeout -1 spawn ssh $BUser@$BHost expect "*password:" { send "$password\r" } expect "$*" { send "pwd\r" } interact

 

注:此文章属懒惰的肥兔原创,版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢。

转载于:https://www.cnblogs.com/chengjian-physique/p/8254381.html

linux之expect相关推荐

  1. linux tcl expect 安装(转)

    linux tcl expect 安装 一.Tcl安装 1.  下载:tcl8.4.20-src.tar.gz http://www.tcl.tk/software/tcltk/downloadnow ...

  2. linux ssh expect,linux命令expect实现ssh登陆

    SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.那么你知道linux命令expect实现ssh登陆么?接下来是小编为大 ...

  3. Linux基于expect(tcl)实现shell自动交互

    1.需求:在shell中执行scp命令时,可以自动输入密码,而不用手工交互输入. 2.方案:采用expect来实现.       Expect是一个基于TCL开发出的语言包.       而TCL(T ...

  4. Linux中expect命令实现交互,修改VNCPASSWD

    需要配置许多VNC服务器,用脚本能够自动执行大部分操作,不过首次配置需设置vnc密码,略为苦恼. expect是Linux中交互的好工具. #!/usr/bin/expect #第一行必不可少,表明调 ...

  5. linux脚本expect分区,linux – 从不同位置执行Expect脚本

    我试图从两个不同的位置运行我的Expect脚本,它将使用引用的以下Expect可执行文件: >我的linux主目录(#!/usr/bin/expect) >另一台服务器上的清晰视图(#!/ ...

  6. Linux使用expect自动登录,linux中使用expect实现自动登录(示例代码)

    在实际生产使用中,比如执行批量操作时,我们不想创建ssh认证,需要使用到密码登录或者链接,此时可以使用expect来操作自动添加password: 在centos系统上expect默认是没有安装的,所 ...

  7. linux脚本expect自动登录,SHELL脚本:利用expect完成SSH自动登录

    有个业务需求,需要在服务器上安装一个Agent,安装Agent其实很简单,但是顶不住服务器数量太多,所以不可能一台台的登上去安装,所以写了个脚本可以实现批量自动化安装 1.脚本实现的功能 根据提供的I ...

  8. linux shell expect 处理 passwd 交互

    实例如下: #!/usr/bin/expectset username [lindex $argv 0] set userpass [lindex $argv 1]# spawn the htpass ...

  9. Linux中expect实现自动登录

    cnde1:/home/boco4a#more ssh.sh #!/usr/bin/expect spawn ssh -l boco4a -p 22 10.226.100.32 expect &quo ...

  10. Linux中expect的命令的使用

    问题引入:在使用我的Thinkpad小本时,那个触摸板一不小心就碰到了,于是想关了它,输入命令: sudo modprobe -r psmouse 这时需要输入密码,ok搞定,但是当在重启时,又可以用 ...

最新文章

  1. 《自然综述-神经科学》:大脑中的反向传播
  2. JSP页面中使用JSTL标签出现无法解析问题解决办法
  3. 英语口语(5月17)
  4. Android中异步任务AsyncTask的使用
  5. 计算机管理ap,如何设置AC功能管理无线AP
  6. java treemap_Java TreeMap pollFirstEntry()方法与示例
  7. YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24
  8. 常用的hooks入门
  9. 有道智云智能语音服务全面升级 最多可支持44种语言和方言
  10. ExtJs xtype一览(转存)
  11. eclipse没有java project_用ecilpse开发一个java程序
  12. 三极管设计,理解饱和,线性区域和截止区
  13. MATLAB学习之泰勒展开(四)
  14. keras如何自定义损失函数(进阶版,not of the form of f(x_true, x_pred))
  15. oracle 安装service pack是什么,安装 service pack 和修补程序 | Microsoft Docs
  16. [js点滴(转)]JavaScript中的this陷阱的最全收集--没有之一
  17. 2023牛客寒假算法基础集训营3(8/11)
  18. strawberry perl环境安装介绍
  19. npm安装依赖至指定版本 npm依赖升级
  20. 黑马入门教程笔记01-OC

热门文章

  1. struts项目部署在Tomca上在断网情况下启动报错
  2. 垃圾回收器之标记擦除法
  3. 在DOS下修改本机IP地址
  4. windows查看linux端口,Linux和Windows下查看端口详解
  5. c+oracle+bulk,C#使用OracleBulkCopy
  6. datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
  7. html如何整齐排列选择框,html – 如何均匀地排列多个内嵌块元素?
  8. springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
  9. 二分法求数组最大最小_JavaScript之如何求数组的最大值和最小值
  10. java和python的优势_Java和Python哪个更好?解读Python对比其他语言的优势