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 技巧:让进程在后台可靠运行的几种方 ...
随机推荐
- excel矩阵运算操作-转置 行列式 相乘 逆阵
excel矩阵运算操作-转置 行列式 相乘 逆阵 https://jingyan.baidu.com/article/154b463128e13928ca8f41a4.html Excel中矩阵的相关 ...
- post 发送方式
/** * post 方式 解码 */ public static String getWebContentByPost(String urlString, String data, final St ...
- Qt编写气体安全管理系统28-模拟工具
一.前言 模拟工具在一些涉及到硬件通信的程序中特别有用,也特别需要,回顾这十年来做过的项目,95%的项目都是软硬件交互的,貌似软硬件结合的项目更有生命力一些,纯软件的或者纯硬件的,并没有那么好控制,如 ...
- php composer 报错 requires php ^7.1.8 || ^8.0 -> your php version
php 环境变量版本低于7.1.8,更新php环境变量版本
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- 本地dev环境,运行时用node模块自动读取并整合文件
const http = require('http'); const fs = require('fs'); const path = require('path'); const glob = r ...
- async + promise 解决回调地狱
// 解决异步回调地狱的方案: async + promise async function writeFile() { // 打开文件 const fd = await new Promis ...
- JAVA代码:生成一个集合,自定义大小,100以内的随机整数
JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...
- 第7/7Beta冲刺
1.团队成员 成员姓名 成员学号 秦裕航 201731062432(组长) 刘东 201731062227 张旭 201731062129 王伟 201731062214 2.SCRU部分 2.1各成 ...
- mysql 逻辑运算符
NOT! 逻辑非. 如果操作数为 0,返回 1:如果操作数为非零,返回 0:如果操作数为 NOT NULL,返回 NULL. mysql> SELECT NOT 10; -> 0 mysq ...