系统小窝欢迎您

电脑公司 深度技术
当前位置:系统小窝 > 系统教程 > Linux教程 >

Linux系统expect命令操作实例

时间:2021-04-10 来源:大神到 人气:

Linux众多命令中,expect命令比较不常见,我们可以使用expect命令来实现脚本的自动登录、等待进程的反馈等。那么expect命令还有哪些用途呢?随小编一起来瞧瞧吧。

先来看一段代码:

#!/usr/bin/expect

set timeout 30

spawn ssh -l root 192.168.1.188

expect ;password:;

send ;abc123456 ;

interact

对这6行进行下解释:

第1行[#!/usr/bin/expect]

这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 这一行需要在脚本的第一行。

第2行[set timeout 30]

基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒

第3行 [spawn ssh -l username 192.168.1.188]

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。所以不要用 ;which spawn;之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

第4行[expect ;password:;]

这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命 令的意思是判断上次输出结果里是否包含;password:;的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30 秒

第5行[send ;abc123456 ;]

这里就是执行交互动作,与手工输入密码的动作等效。

温馨提示: 命令字符串结尾别忘记加上; ;,如果出现异常等待的状态可以核查一下。

第6行[interact]

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

在Linux下,执行ssh登陆或者是scp复制文件的时候可以使用到该命令,实现自动输入密码。

案例1:远程执行命令

#!/usr/bin/expect -f

set timeout 30

spawn ssh -l root 192.168.1.188

expect {

;yes/no; { send ;yes ;;exp_continue }

;password:; { send ;abc123456 ; }

}

expect -re ;]($|#) ;

send ;bash /root/test.sh ;

expect -re ;]($|#) ;

send ;exit ;

该代码的功能是执行远程服务器上的/root/test.sh脚本,参数;-re;是匹配正则表达式。可以写多行send,执行多个命令。该脚本的另一种写法

#!/bin/bash

expect -c ;

spawn ssh root@192.168.1.188 ;ifconfig;whoami;pwd;echo hello;;

expect {

;*assword; {set timeout 30; send ;abc123456 ;;}

;yes/no; {send ;yes ;; exp_continue;}

}

expect eof

;

参数;-c;是指在命令行执行expect。把要执行的命令用分号隔开了。并且执行过程中没有shell提示符的,有兴趣的你可以测试下。

 

案例2:批量处理

在需要管理大量的Linux服务器时,可以这样做:

1.host.list

192.168.1.1 22 root abc1

192.168.1.2 22 root abc2

192.168.1.3 22 root abc3

192.168.1.4 22 root abc4

192.168.1.5 22 root abc5

192.168.1.6 22 root abc6

192.168.1.7 22 root abc7

192.168.1.8 22 root abc8

我们把服务器的IP地址、端口号、用户名、密码一起放在host.list文件里,按行排列。

下面来看看脚本文件main.exp

#!/usr/bin/expect -f

set ipaddress [lindex $argv 0]

set port [lindex $argv 1]

set username [lindex $argv 2]

set passwd [lindex $argv 3]

set timeout 30

spawn ssh $ipaddress -p$port -l$username

expect {

;yes/no; { send ;yes ;;exp_continue }

;password:; { send ;$passwd ; }

}

expect -re ;]($|#) ;

send ;bash /root/test.sh ;

expect -re ;]($|#) ;

send ;exit ;

来做一个while循环:whi.sh

#!/bin/bash

host=;host.list;

while read line

do

expect main.exp $line

done 《 $host

把以上脚本都赋予执行权限,就可以了。

案例3:scp文件传输

expect -c ;

spawn scp root@192.168.1.188:/root/file1.tgz /root

expect {

;*assword; {set timeout 300; send ;abc123456 ;;}

;yes/no; {send ;yes ;; exp_continue;}

}

expect eof

;

同样的原理,也可以做循环进行批量管理,还可以更简化脚本,也不多说明了,有兴趣的同学可以多尝试下。使用expect进行自动输入密码登陆,基本多用于批量管理。也还算方便。关于批量管理有多种方法,可以在主机之间建立ssh信任机制,也可以免密码登陆管理等。还可以使用sshpass(外部命令)这个命令进行带密码在脚本里执行自动输入密码。

上面就是Linux使用expect命令的方法介绍了,本文一共介绍了expect命令的三个操作实例,通过这些实例的练习,你一定能轻松掌握expect命令的用法。

相关文章

  • 如何使用命令行更改Linux系统的日期和时间

    如何使用命令行更改Linux系统的日期和时间

    Linux 系统的时间有时候会不准,不准确的时间会导致日志文件中的时间出现错误,所以准确的时间是很重要的,那么要怎么更改Linux 系统的时间呢?下面小...
    2014-12-02 03.12.57
  • Linux tail命令的用法

    Linux tail命令的用法

    Linux tail命令主要用于把档案文件的最后几行显示到终端上,以确保能看到最新的内容,那么Linux tail要怎么用呢?下面小编就给大家介绍下Linux tail的用法。...
    2014-12-03 02.12.47
  • 最详细的Linux压缩解压缩命令

    最详细的Linux压缩解压缩命令

    压缩文件可以为磁盘节省不少空间,那么Linux系统的压缩和解压命令都有哪些呢?下面小编就给大家介绍下Linux压缩和解压的命令大全,希望对你有所帮助。...
    2014-12-03 04.12.37
  • Linux中pwd命令有什么用?

    Linux中pwd命令有什么用?

    Linux pwd命令主要用于打印当前工作目录的工作路径, 如果你想要使用pwd命令,就要对pwd命令的用法十分了解,下面小编就给大家介绍下Linux中的pwd命令的用...
    2014-12-04 03.12.11
  • Linux中如何使用rmdir命令指南

    Linux中如何使用rmdir命令指南

    我们都知道Linux命令中的rm命令主要用于删除文件,那么 rmdir命令又有什么作用呢?下面小编就给大家介绍下Linux命令中rmdir命令的主要功能吧。...
    2014-12-04 04.12.46

发表评论

验证码: 看不清?点击更换

注:网友评论仅供其表达个人看法,并不代表本站立场。