expect命令详解

简介:

脚本代码如下: 
############################################## 
#!/usr/bin/expect 
set timeout 30 
spawn ssh -l username 192.168.1.1 
expect "password:" 
send "ispass\r" 
interact 
############################################## 
1. [#!/usr/bin/expect] 
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和Linux下的bash、windows下的cmd是一类东西。 
注意:这一行需要在脚本的第一行。 
2. [set timeout 30] 
基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 
3. [spawn ssh -l username 192.168.1.1] 
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 "ispass\r"] 
这里就是执行交互动作,与手工输入密码的动作等效。 
温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。 
6. [interact] 
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 
#!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下 
# Change a login shell to bash 
set user [lindex $argv 0] 
spawn bash $user 
expect "]:" 
send "/bin/bash " 

   7. set date [exec date +%F]

        获取shell变量,赋予expect使用

  8.binary

        进入二进制模式,prompt相反

然后问题就来了。

首先要安装

#apt-get install expect  或是 yum install expect

然后,上面的脚本使用sh命是无法运行的,这点一定要记住,不然会报如下:


start.sh: line 3: spawn: command not found
": no such file or directory:
start.sh: line 5: send: command not found
start.sh: line 6: interact: command not found

解决的办法如下:

含有expect的脚本不能用bash执行,bash无法解析。添加可执行权限后,直接./your_script即可。

然后问题又来了,它会报 /usr/bin/expect^M: bad interpreter: 没有那个文件或目录

这时要这么办:

运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就是linux和windows之间的不完全兼容。。。
具体细节不管,如果验证:
vim test.sh
:set ff?
如果出现fileforma=dos那么就基本可以确定是这个问题了。
:set fileformat=unix
:wq
OK了。。。。。。。

bash: ./eth0-access: /bin/bash^M: bad interpreter: 没有那个文件或目录

错误分析:

因为操作系统是windows,我在windows下编辑的脚本,所以有可能有不可见字符。

脚本文件是DOS格式的, 即每一行的行尾以 来标识, 其ASCII码分别是0x0D, 0x0A.

可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的

解决方法:

vim filename

然后用命令

:set ff? #可以看到dos或unix的字样. 如果的确是dos格式的。

然后用

:set ff=unix #把它强制为unix格式的, 然后存盘退出。

再次运行脚本。

好累,终于写完了。



本文转自 运维小学生 51CTO博客,原文链接:http://blog.51cto.com/yasar/1874188,如需转载请自行联系原作者

相关文章
|
6月前
|
Linux 测试技术 Shell
Linux expect命令详解
在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。
404 5
Linux expect命令详解
|
Shell Linux
Centos7:“Entering emergency mode. Exit the shell to continue”错误解决方法
想过很多朋友有遇到这种情况,就是正在远程使用centos7系统时,一旦让远程虚拟机或服务器断电或强制关机,那么再次重启时就会出现“Entering emergency mode. Exit the shell to continue.”的错误。
11900 1
Centos7:“Entering emergency mode. Exit the shell to continue”错误解决方法
|
4月前
|
JSON Java Linux
linux 命令使用总结:vim,nohup,find,df,du,sudo,netstat,ll,curl,lastlog
linux 命令使用总结:vim,nohup,find,df,du,sudo,netstat,ll,curl,lastlog
68 5
|
Devops Linux 虚拟化
Linux命令ifconfig报错command not found
Linux命令ifconfig报错command not found
154 0
|
Shell Linux
Linux pip命令报错 -bash: pip: command not found
Linux pip命令报错 -bash: pip: command not found
358 0
|
Shell
Shell内值命令之alias和echo
Shell内值命令之alias和echo
152 0
|
Shell
-bash: wget: command not found 解决方法
-bash: wget: command not found 解决方法
2351 0
|
Shell Linux
CentOS7:rz -bye -bash: rz: command not found
CentOS7:rz -bye -bash: rz: command not found
116 0
|
资源调度 Shell
-bash: hexo: command not found
Mac上搭建Hexo报错: 解决办法: yarn global add hexo-cli
1507 0