IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux expect错误提示:bash: spawn: command not found;couldn‘t read file|expect安装|expect详解|expect精美案例 -> 正文阅读

[系统运维]Linux expect错误提示:bash: spawn: command not found;couldn‘t read file|expect安装|expect详解|expect精美案例

[root@RHEL7 expect]# . ssh.exp 
bash: spawn: command not found...
couldn't read file "{": no such file or directory
bash: yes/no: No such file or directory

重点:先说问题的根源。

1、务必保证已安装了expect的依赖tcl

2、务必保证安装了expect

问题根源:在执行脚本时,用的是#. file.exp 而不是 #./file.exp。问题就出在这个斜杠上

一、shell回顾

shell的执行方式的种类:

第一种使用绝对路径执行

第二种使用相对路径执行,如./的方式

第三种使用 sh命令来执行 格式 sh 脚本名 不需要执行权限 -x参数(显示执行过程)

第四种使用 . (空格)脚本名称的方式执行 不需要执行权限 . a.sh

第五种使用 source 脚本名称 不需要执行权限(主要用于生效配置文件)

案例中的expect用第四种方法 . (空格)来执行就会报错:?

[root@RHEL7 expect]# . ssh.exp 
bash: spawn: command not found...
couldn't read file "{": no such file or directory
bash: yes/no: No such file or directory

?第二种,相对路径的方式执行就可以了。

注:普通的bash shell,以上5种执行方法均可,expect就没这么好使了,优先选第二种方式!


?特别说明:至此问题已解决,你还有宝贵的时间,可以继续,如果比较忙,下面内容可以略过!


?二、expect安装+问题还原

1.安装expect依赖tcl

1.下载依赖包

http://www.tcl.tk/software/tcltk/downloadnow84.tml

选择: tcl8.4.20-src.tar.gz

?

2.安装依赖

#tar zxf tcl8.4.20-src.tar.gz -C /usr/src/

#cd /usr/src/tcl8.4.20

#ls 可以看到解压后,该工具支持多种系统

#cd unix/ 进入unix系统

#./configure --prefix=/usr/local/tcl --enable-shared 开启共享功能

#make -j 4

#make install

?

?3.复制tcl的配置文件到上一级目录文件夹中(配置)

#cd /usr/src/tcl8.4.20/unix/ 注:tcl  本身是支持windows和mac的,需切换一下目录
#ls 
#cp tclUnixPort.h  ../generic/ 把配置文件复制一份到上级目录的文件夹下(安装expect时要用到)

?2.安装expect?

1.下载安装包

下载地址:
expect5.45.tar.gz
https://sourceforge.net/projects/expect/files/latest/download

?

#cd
#cd mypackage 切换到压缩包存放位置

?

?2.安装expect

#tar zxf expect5.45.tar.gz -C /usr/src  解压到指定位置
#cd /usr/src/expect5.45/ 切换到解压目录
#./configure --prefix=/usr/local/expect --with-tcl=/usr/local/tcl/lib  --with-tclinclude=/usr/src/tcl8.4.20/generic/
#make -j 4
#make install 

?注:prefix指定安装路径 ;with 添加对tcl支持 指定tcl lib库的地址 ;引用一下tcl的配置文件,使两者关联起来。

3.给expect创建软链接(便于记忆和使用)

#ln -s /usr/local/tcl/bin/expect  /usr/local/expect/bin/expect
#ln -s /usr/local/tcl/bin/expect  /bin/expect  同时也可以连接到bin下面和/bin/bash同级目录
#ln -s /usr/local/tcl/bin/expect  /usr/bin/expect   做软链接(便于使用)

注:expect的命令实际是在Tcl包里,并不是在expect包里。
所以需要把tcl中的expect命令做一个软链接,链接到expect包里。?

附:以上是手动安装,当然也可以用yum安装,yum可以自动解决依赖问题。
#yum -y install expect?

4.编写脚本(报错案例)

#vim ssh.exp

#!/usr/bin/expect -f  #注:这里的-f不是必须
set timeout 30
spawn ssh root@127.0.0.1
expect {   #注:关键字与大括号之间有个空格
"yes/no"  {send "yes\r" ; exp_continue }
"password:" {send "root\r" }
}
interact

5.问题还原与处理

#chmod +x ssh.exp 给脚本添加执行权限
#. ssh.exp 注:点后面有空格。这种写法是shell的第四种执行方法(执行expet就是错误方法)

[root@RHEL7 expect]# . ssh.exp 
bash: spawn: command not found...
couldn't read file "{": no such file or directory
bash: yes/no: No such file or directory

就是这个错误,各种找度娘,问题没能找到合适的答案,这是一个细节问题。

expect的执行和bash shell的执行,无论是语法还是执行方式,都有着差异。

运行expect时,需要采用第二种,采用当前路径#./的方式执行,

三、expect深入详解

1.expect 详解

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

expect自动交互流程:

spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.

2.expect常用命令

spawn ? ? ? ? ? ? ? 交互程序开始后面跟命令或者指定程序
expect? ? ? ? ? ? ? ?等待一个进程的反馈,获取匹配信息匹配成功则执行expect后面的程序动作
send ? ?exp_send ? ?用于发送指定的字符串信息
exp_continue ? ? ? ?在expect中多次匹配就需要用到
send_user ? ? ? ? ? 用来打印输出 相当于shell中的echo
exit? ? ? ? ? ? ? ? ?退出expect脚本
eof? ? ? ? ? ? ? ? ? expect执行结束 退出
set? ? ? ? ? ? ? ? ? 定义变量
puts ? ? ? ? ? ? ? ?输出变量

set timeout ? ? ?设置超时时间
interact    退出自动化,开始允许用户交互

3.案例中,每行代码详解

1. [#!/usr/bin/expect]???
??? 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。???
注意:这一行需要在脚本的第一行。?
??

2. [set timeout 30]?????

设置超时时间的,现在你只要记住他的计时单位是:秒???

注:如果设置为-1,不予超时

3. [spawn ssh root@127.0.0.1]????
??? spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。???它主要的功能是给ssh运行进程加个壳,用来传递交互指令。???

4. [expect "password:"]???

expect {"yes/no" { send "yes\r" ;exp_continue}"password:" { send "123456\r"}}

这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。

这个命令的意思是判断上次输出结果里是否包含“yes/no”的字符串,如果有则立即通过send返回一个值,继续判断是否带有password字符串 有则通过send返回一个值 ,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒???

5. [send "root\r"]???
??? 这里就是执行交互动作,与手工输入密码的动作等效。???
??? 温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。??

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

四、expect精美案例

1.写一个简略版的远程登录

#vim 1.exp

#!/usr/bin/expect
spawn ssh saneri@192.168.56.103 df -Th
expect "*password"
send "123456\n"
expect eof

2.写一个expect脚本,执行多条命令

#vim 2.exp

#!/usr/bin/expect -f
set timeout 10
spawn sudo su - root
expect "*password*"
send "123456\r"
expect "#*"
send "ls\r"
expect "#*"
send "df -Th\r"
send "exit\r"
expect eof

3.内部自定义参数的远程登录

#vim 3.exp

#!/usr/tcl/bin/expect
set timeout 30
set host "101.200.241.109"
set username "root"
set password "123456"

spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

4.expect外部参数个数和外部参数的取用

#vim 4.exp

#!/usr/tcl/bin/expect
if {$argc < 3} {
    puts "Usage:cmd <host> <username> <password>"
    exit 1
}
set timeout -1
set host [lindex $argv 0] 
set username [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

在expect中,$argc表示参数个数,而参数值存放在$argv中,

比如取第一个参数就是[lindex $argv 0],以此类推。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:13:35  更:2021-10-02 15:17:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 17:59:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码