expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。
需要expect工具的话可以在linux环境中使用apt-get或yun install expect去获取安装,或是到expect开源项目的网站:http://expect.sourceforge.net/ 来获取。
安装expect之后,可以尝试使用以下的代码来完成对单个服务器的scp任务:
#!/usr/bin/expect set timeout 30 set host [lindex $argv 0] set port [lindex $argv 1] set username [lindex $argv 2] set password [lindex $argv 3] set src_file [lindex $argv 4] set dest_file [lindex $argv 5] spawn scp -P $port $src_file $username@$host:$dest_file expect { "(yes/no)?" { send "yes\n" expect "*assword: " { send "$password\n"} } "*assword: " { send "$password\n" } } expect "100%" expect eof
注意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为30秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待30秒后该脚本的执行会自动终止。
从以上代码刚开始的几行可以看出,我为这个脚本设置了6个需要手动输入的参数,分别为:目标主机的IP、ssh端口、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:
./expect_scp 192.168.1.10 22 root 123456 /root/src_file /root/dest_file
以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.1.10中的/root下,同时还将这个源文件重命名为dest_file。
spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。
有了这段expect的代码,还只能完成对单个远程主机的scp任务。如果需要实现批量scp的任务,则需要再写一个shell脚本来调用这个expect脚本:
#!/bin/sh list_file=$1 src_file=$2 dest_file=$3 cat $list_file | while read line do host=`echo $line | awk '{print $1}'` port=`echo $line | awk '{print $2}'` username=`echo $line | awk '{print $3}'` password=`echo $line | awk '{print $4}'` echo "$host" ./expect_scp $host $port $username $password $src_file $dest_file done
指定了3个参数:列表文件的位置、本地源文件路径、远程主机目标文件路径。需要说明的是其中的列表文件指定了远程主机ip、ssh端口、用户名、密码,这些信息需要写成以下的格式:
host port username password
中间用空格或tab键来分隔,多台主机的信息需要写多行内容,如:
192.168.75.130 22 root 123456
192.168.75.131 10022 knktc testpass
这样就指定了两台远程主机的信息。注意,如果远程主机密码中有“$”、“#”这类特殊字符的话,在编写列表文件时就需要在这些特殊字符前加上转义字符,否则expect在执行时会输入错误的密码。
对于这个shell脚本,保存为batch_scp.sh文件,与刚才保存的expect_scp文件和列表文件(就定义为hosts.list文件吧)放到同一目录下,执行时按照以下方式输入命令就可以了:
./batch_scp.sh ./hosts.list /root/src_file /root/destfile
用这两个脚本文件,就可以简单地完成批量scp的任务了。
其实批量scp的任务并不难,但是批量ssh的任务可能就会遇到麻烦了。
相关推荐
Expect工具简介 Expect 是一种工具,主要用于实现自动化交互式的操作,它由 Don Libes 开发,基于 Tcl(Tool Command Language)语言。通过使用 Expect,可以将原本需要手动进行的操作,例如 SSH 登录、FTP 登录等...
总之,Expect 结合 SCP 提供了一种高效且自动化的方式,可以方便地在多台服务器之间进行文件批量传输。这种方式在系统运维和持续集成/持续部署(CI/CD)场景中非常有用,能显著提高工作效率并减少人为错误。
这个"shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止"的方案,就是一种典型的自动化运维实践,它结合了多个核心工具和技术,包括shell脚本、expect、ssh以及scp,用于实现远程服务器管理与文件...
在IT行业中,shell脚本是Linux/Unix系统管理员不可或缺的工具之一,特别是在处理批量任务时。本文主要讨论如何使用shell脚本来实现批量复制文件和执行命令,这对于管理多台服务器或者自动化运维工作流程非常有用。 ...
通过本文,我们了解了expect这一强大工具的基本概念、工作原理及其应用场景,并通过一个具体的示例深入了解了expect脚本的编写方法。expect不仅能够极大地提高系统的运维效率,还能够降低人为错误的风险,是Linux...
为了自动化这个过程,我们可以结合`shell脚本`和`expect`工具来实现。`expect`是一个强大的自动化交互式程序的工具,它可以模拟用户输入,使得脚本能够自动执行需要交互的任务。 首先,让我们了解`SCP`命令的基本...
通过这些脚本,我们可以学习到如何利用Shell脚本进行自动化运维,如批量生成和部署SSH密钥,自动化SCP文件传输,以及如何使用Expect库来处理需要用户交互的命令。这些都是IT专业人士在日常工作中非常实用的技能,...
为了解决这一问题,这篇博文介绍了如何使用expect工具实现shell脚本中的SSH无交互自动登录。 expect工具是基于Tcl语言编写的,它能够通过自动化的方式响应程序输出的提示信息。在ssh命令执行时,expect可以用来捕获...
总的来说,这些资源为你提供了在Java环境中调用Shell脚本所需要的基础工具和示例,涵盖了SSH连接、命令执行和交互式脚本控制。通过学习和使用这些库,你将能够构建强大的系统管理工具和自动化解决方案。
### 一、单独写一个expect脚本 创建一个单独的expect脚本,例如`auto_scp.sh`。在脚本中,我们定义了服务器的IP地址、端口、目录、用户名和密码,然后使用`spawn`启动SCP命令,接着使用`expect`来匹配和响应登录...
在Shell脚本中结合使用`expect`,可以编写出更加智能和自动化的脚本,减少手动操作的繁琐。 首先,确保你的系统已经安装了`expect`。在CentOS 5.x上,可以通过`yum`命令来安装: ```bash yum -y install expect ``...
Shell脚本实现自动输入密码登录服务器是自动化运维和部署中的常见需求,特别是在执行涉及权限验证的任务时,如scp文件传输或SSH远程连接。在这种情况下,使用expect工具可以帮助我们编写脚本,自动处理需要用户交互...
`expect`工具正是这样一个强大的自动化脚本工具,尤其在处理交互式协议如SSH(Secure Shell)、FTP(File Transfer Protocol)和TELNET时,它能模拟用户输入,使得自动化过程变得更加简单。本文将深入探讨`expect`...
此时,就需要一个像Expect这样的工具来实现交互式的自动化脚本。 #### 四、Expect简介 Expect是一个开源软件,最初由Don Libes开发,现由NIST(美国国家标准与技术研究院)维护。它使用Tcl语言编写,可以在各种类...