http://www.cnblogs.com/lzrabbit/p/4298794.html

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

  1. #!/usr/bin/expect
  2. spawn ssh root@192.168.22.194
  3. expect "*password:"
  4. send "123\r"
  5. expect "*#"
  6. interact

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

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

问题

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


四个命令

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

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

1. send命令

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

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

2. expect命令


(1)基础知识

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

  1. expect "hi\n"
  2. send "hello there!\n"

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

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

比如如下程序:

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

当在标准输入中输入

  1. test
  2. hi

是,运行结果如下

  1. you typed: test
  2. hi
  3. I only expect: hi

(2)模式-动作

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

单一分支模式语法:

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

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

多分支模式语法:

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

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

  1. expect {
  2. "hi" { send "You said hi\n"}
  3. "hello" { send "Hello yourself\n"}
  4. "bye" { send "That was unexpected\n"}
  5. }

3. spawn命令

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

  1. set timeout -1
  2. spawn ftp ftp.test.com //打开新的进程,该进程用户连接远程ftp服务器
  3. expect "Name" //进程返回Name时
  4. send "user\r" //向进程输入anonymous\r
  5. expect "Password:" //进程返回Password:时
  6. send "123456\r" //向进程输入don@libes.com\r
  7. expect "ftp> " //进程返回ftp>时
  8. send "binary\r" //向进程输入binary\r
  9. expect "ftp> " //进程返回ftp>时
  10. 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后,允许用户交互。

  1. spawn ftp ftp.test.com
  2. expect "Name"
  3. send "user\r"
  4. expect "Password:"
  5. send "123456\r"
  6. interact

解决方法

上文中提到:

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

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

  1. #!/home/tools/bin/64/expect -f
  2. set timeout -1
  3. spawn ssh $BUser@$BHost
  4. expect "*password:" { send "$password\r" }
  5. expect "$*" { send "pwd\r" }
  6. interact

libssh2

https://github.com/libssh2/libssh2

https://github.com/libssh2/libssh2

https://www.libssh2.org/docs.html

linux expect详解(ssh自动登录)

http://www.cnblogs.com/lzrabbit/p/4298794.html

https://sourceforge.net/projects/ipmitool/

ipmitool

编辑 锁定

本词条缺少信息栏名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
 
ipmitool 是一种可用在 linux 系统下的命令行方式的 ipmi 平台管理工具,它支持 ipmi 1.5 规范(最新的规范为 ipmi 2.0),通过它可以实现获取传感器的信息、显示系统日志内容、网络远程开关机等功能。[1] 

libssh2的更多相关文章

  1. libssh2 的集成与应用

    http://blog.csdn.net/wyc6668205/article/details/9179197 Xmanager Enterprise 4 putty 等工具都功能都是利用libssh ...

  2. 在Visual Studio 2013中编译libssh2项目

     一. 下载需要的外部包,并解压,下面给出的链接如果无法访问,就google搜索下载一下: •下载openssl •下载zlib 二.修改libssh2项目配置: 1.C/C++->Gene ...

  3. python使用libssh2连接linux

    1.安装(1)使用下面命令获得最新版本的ssh4py安装包    git clone git://github.com/wallunit/ssh4py (2)解压ssh4py后使用下面命令进行安装: ...

  4. Linux上安装Libssh2

    由于项目需要使用libssh2,在安装时,遇到一些问题,发现网上的都是互相抄,把自己遇到的问题,记下来,希望可以帮助到别人,自己下次使用时候,也方便查找,节约时间. 安装的流程: 1.下载源码,wge ...

  5. MinGW环境libssh2安装

    由于实习工作中要用到基于sftp协议开发一个网络程序,同时要实现运行在Windows平台上,找来找去就这个libssh2库好用,在网络上算是有那么一点点的文档可以看.这个库还不是现成的,还要进行源代码 ...

  6. 使用libssh2连接到远程服务器

    libssh2-1.7.0.tar.gz  示例代码:libssh2-1.7.0.tar.gz\libssh2-1.7.0\example 官网示例 https://www.libssh2.org/e ...

  7. 使用libssh2库实现支持密码参数的ssh2客户端

    使用libssh2库实现支持密码参数的ssh2客户端 http://blog.chinaunix.net/uid-24382173-id-229823.html libssh2的简单应用 http:/ ...

  8. libssh2进行远程运行LINUX命令

    /** * CSSHClient.h * @file 说明信息.. * DATE February 13 2015 * * @author Ming_zhang */ #ifndef _CSSHCLI ...

  9. Windows VS2017 编译 libssh2 1.7.0(执行命令、文件上传、下载)

    下载安装 OpenSSL 要编译 libssh2,必须先编译好 OpenSSL 的静态库,直接从 http://slproweb.com/products/Win32OpenSSL.html 下载已经 ...

随机推荐

  1. pandas DataFrame的创建方法

    pandas DataFrame的增删查改总结系列文章: pandas DaFrame的创建方法 pandas DataFrame的查询方法 pandas DataFrame行或列的删除方法 pand ...

  2. PHP中的6种加密方式

    PHP中的6种加密方式 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. raw ...

  3. select2赋值需要注意

    $('#mySelect2').val(data.id).trigger('change'); 需要在赋值后,调用下change事件,不然的话展示值的span不会显示select最新的选中值.

  4. php开发中处理emoji表情和颜文字的兼容问题

    背景:随着手机的普及,现在移动开发很火爆,已经远远超过了pc端.在移动设备经常会发生用户发送的内容中包含emoji表情,在显示时就是乱码.一般是因为Mysql表设计时,都是用UTF8字符集的.把带有e ...

  5. Hibernate映射关系之_多对多

    多对多关系由于效率的原因,实际中会拆成相互的一对多的关系,不再累述

  6. hdu6097 Mindis(几何)

    题解: 这里是用解析解的做法, 我们发现如果以P和Q做椭圆,那么当椭圆与圆相切的时候,答案最优 那么方程就是这样的 联立之后,解delta等于0,可以得到 答案就是2a了 注意不一定任何情况都有解,当 ...

  7. python数据绘图常用方法总结

    挖坑,以后还会更新吧 做数学建模画图使用了matplotlib和numpy,这里简单总结一下常用的用法 一.数据拟合 1.np.polyfit(x, y, n) 使用n次多项式去拟合x,y散点图,返回 ...

  8. [bzoj2901]矩阵求和

    题目大意:给出两个$n\times n$的矩阵,$m$次询问它们的积中给定子矩阵的数值和. 题解:令为$P\times Q=R$ $$\begin{align*}&\sum\limits_{i ...

  9. bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树

    人傻自带大常数 二分的可行性证明: 贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案 #i ...

  10. github导入springboot maven项目

    1.在GitHub里force喜欢的项目,获取GitHub项目地址,eclipse---import---project from git---clone uri---next---finish,项目 ...