expect脚本远程登录、远程执行命令和脚本传参简单用法
expect介绍:
最近想写一个自动化安装脚本,涉及到远程登录、分发文件包、远程执行命令等,其中少不了来回输入登录密码,交互式输入命令等,这样就大大降低了效率,那么有什么方法能解决呢?不妨试试expect:
- expect是一款自动化的脚本解释型的工具。
- expect基于tcl脚本,expect脚本的运行需要tcl的支持。
- expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。
- expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。
远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。
expect安装
一般机器不会自带expect和tcl需要手动安装。
[root@bqh-nfs- ~]# yum install expect tcl -y
[root@bqh-nfs- ~]# rpm -qa expect tcl
expect-5.44.1.15-.el6_4.x86_64
tcl-8.5.-.el6.x86_64
expect基础知识
expect脚本
脚本开头
expect脚本一般以#!/usr/bin/expect -f开头,类似bash脚本。
常用后缀
expect脚本常常以.exp或者.ex结束。
expect主要命令
- spawn 新建一个进程,这个进程的交互由expect控制
- expect 等待接受进程返回的字符串,直到超时时间,根据规则决定下一步操作
- send 发送字符串给expect控制的进程
- set 设定变量为某个值
- exp_continue 重新执行expect命令分支
- [lindex $argv 0] 获取expect脚本的第1个参数
- [lindex $argv 1] 获取expect脚本的第2个参数
- set timeout -1 设置超时方式为永远等待
- set timeout 30 设置超时时间为30秒
- interact 将脚本的控制权交给用户,用户可继续输入命令
- expect eof 等待spawn进程结束后退出信号eof
expect命令分支
expect命令采用了tcl的模式-动作语法,此语法有以下几种模式:
单一分支语法
set password
expect "*assword:" { send "$password\r" }
当输出中匹配*assword:时,输出password变量的数值和回车。
多分支模式语法
set password
expect {
"(yes/no)?" { send "yes\r"; exp_continue }
"*assword:" { send "$password\r" }
}
当输出中包含(yes/no)?时,输出yes和回车,同时重新执行此多分支语句。
当输出中匹配*assword:时,输出password变量的数值和回车。
自动远程登录脚本:bqh-nfs-123机器免输密登录bqh-back-124机器上
[root@bqh-nfs- scripts]# vim test.exp #!/usr/bin/expect -f #expect的路径,which expect查询获取
set timeout 20 #连接超时
set host "192.168.0.124"
set password ""
spawn ssh root@$host #登录服务器用户+地址
expect { #等待接受进程返回的字符串
"yes/no" {send "yes\n";exp_continue} #等待输入yes
"password:" {send "$password\n"} #等待输入密码
}
interact #将脚本的控制权交给用户,用户可继续输入命令

执行结果如下:

expect脚本远程执行命令:
[root@bqh-nfs- scripts]# vim test.exp #!/usr/bin/expect -f
set timeout
set host "192.168.0.124"
set password ""
spawn ssh root@$host
expect {
"yes/no" {send "yes\n";exp_continue}
"password:" {send "$password\n"}
}
expect "]*"
send "/application/nginx/sbin/nginx\n"
expect "]*"
send "lsof -i:80\n"
expect "]*"
send "echo 1147076062 >1.log\n"
expect "]*"
send "cat 1.log\n"
expect "]*"
send "exit\n"

执行结果如下:


expet脚本传参执行命令:
[root@bqh-nfs- scripts]# cat test1.exp
#!/usr/bin/expect set user [lindex $argv ]
set host [lindex $argv ]
set passwd ""
set cmd [lindex $argv ]
spawn ssh $user@$host expect {
"yes/no" { send "yes\n"}
"password:" { send "$passwd\n" }
} expect "]*"
send "$cmd\n"
expect "]*"
send "exit\n"

执行结果如下:

expect脚本远程登录、远程执行命令和脚本传参简单用法的更多相关文章
- [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)
转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...
- python批量操作Linux服务器脚本,ssh密码登录(执行命令、上传、下载)(一)
-*- paramiko.util.log_to_file( ssh = paramiko.SSHClient() ssh.set_missing ...
- python批量操作Linux服务器脚本,key登录(执行命令、上传、下载)(二)
-*- 2 #批量操作linux服务器(执行命令,上传,下载) 3 #!/usr/bin/python 4 import paramiko 5 import datetime ...
- 使用paramiko远程登录并执行命令脚本
#!/usr/bin/env python #coding=utf-8 import paramiko, getpass,sys,traceback class ssh_utils(): def lo ...
- shell 结合expect实现ssh登录并执行命令
#!/bin/bash ips=( '127.0.0.1' ) ;i<${#ips[*]};i++)) do expect <<EOF #这里的 expect <<EOF ...
- Linux命令之远程登录与执行远程主机命令
实现远程登录的命令 ssh.telnet.rlogin (1)ssh命令 ssh命令是openssh套件中的客户端连接工具,可以给予ssh加密协议实现安全的远程登录服务器.ssh命令用于远程登录上Li ...
- Python 实现远程服务器批量执行命令
paramiko 远程控制介绍 Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录.首先来看一个简单的例子 import parami ...
- linux下远程服务器批量执行命令及SFTP上传文件 -- python实现
之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...
- linux 命令行远程登录 后台运行命令的方法
linux 命令行远程登录 后台运行命令的方法 http://blog.csdn.net/isuker/article/details/55061595 Linux 技巧:让进程在后台可靠运行的几种方 ...
随机推荐
- 取消本地文件夹与SVN服务器的关联
我们在开发项目中用SVN作为版本管理工具时,从服务器下载到本地的项目是有.svn文件夹的,这个代表是与svn服务器代码相关联的,如果我们想取消本地文件夹与svn服务器的关联,那么有多种方法,这里介绍导 ...
- (九)Knockout 进一步技术
加载和保存 JSON 数据 Knockout允许您实现复杂的客户端交互,但是几乎所有web应用程序还需要与服务器交换数据,或者至少要序列化数据以供本地存储.交换或存储数据最方便的方式是JSON格式-- ...
- Python3基础 dict __len__ 统计键值对的数量
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- IEnumerable是什么
首先怎么认识一个对象 IE+number+able IE数字 可能 从名字上看不出什么玩意,以至于很久都没人真正认识这个接口 先看官方的解释 IEnumerable Interface Expose ...
- EasyNVS摄像机公网全终端无插件网页摄像机直播管理服务运行出现“请求服务不存在或已停止”
背景分析 了解我们产品线的小伙伴都知道,EasyNVR产品主要用于互联网安防直播,通过EasyNVR拉取摄像机的RTSP视频流,客户端通过访问EasyNVR服务端就可以实现音视频流分发.在此情况下会出 ...
- ObjectARX创建带文字的线型实例代码
AcDbLinetypeTable* pLinetypeTable=NULL; Acad::ErrorStatus es = acdbHostApplicationServices()->wor ...
- python爬虫1
1 网页结构 html:超文本标记语言------->类似人的鼻子耳朵,长在那里,大体骨架就是那个样子 css:层叠样式表------->这个是外观的深化,比如贴个双眼皮,橙色眼睛... ...
- openstack 权限控制 (添加自定义角色)keystone等组件
每一个平台.系统都会对于用户的权限进行严格的管理与控制. openstack是一个开源的项目,我们可以直接下载其源码,进行更改以达到我们的要求. 这里只是针对于用户的权限进行管理,以keystone: ...
- 华为路由器+三层交换,路由器配置DHCP,交换机中继DHCP
LSW14:undo terminal monitorsystem-viewsysname SW1vlan batch 10 20 30 40 66interface Ethernet0/0/1por ...
- 【C++札记】函数重载
概述 函数重载指在相同作用域中多个函数名相同,函数的形参不同. 遵循规则: 1.函数名相同 2.函数的参数,类型,个数或顺序不一样都可以构成重载. 3.函数返回值得类型不同不构成重载,编译直接报错,存 ...