Linxu下 expect的实用实例_1
案例
例1:
从本机自动登录到远程机器192.168.1.200(端口是22,密码是:PASSWORD)
登录到远程机器后做以下几个操作:
1)useradd wangshibo
2)mkdir /opt/test
3) exit自动退出
- [root@xw4 tmp]# cat test-ssh.sh
- #!/bin/bash
- passwd='PASSWORD'
- /usr/local/bin/expect <<-EOF
- set time 30
- spawn ssh -p22 root@192.168.1.201
- expect {
- "*yes/no" { send "yes\r"; exp_continue }
- "*password:" { send "$passwd\r" }
- }
- expect "*#"
- send "useradd wangshibo\r"
- expect "*#"
- send "mkdir /opt/test\r"
- expect "*#"
- send "exit\r"
- interact
- expect eof
- EOF
- [root@xw4 tmp]# sh test.sh
- spawn ssh -p22 root@192.168.1.201
- root@192.168.1.201's password:
- Last login: Fri Sep 23 16:21:20 2016 from 192.168.1.23
- [root@vm-002 ~]# useradd wangshibo
- [root@vm-002 ~]# mkdir /opt/test
- [root@vm-002 ~]# [root@xw4 tmp]#
例2:我们在部署无密码访问时,手工建立ssh互信需要好几个步骤,并且中途人工交互(输入密码等),如果机器数目多,则很繁琐!
下面方法用于自动化生成authorized_keys,免去了手工数据.
方法: 利用expect编写sshkey.exp在远程主机上生成id_rsa,并重定向到本地.在利用noscp.exp.把文件复制到远程主机
为了节省自己的时间,可以写个expect自动化脚本,分享如下:
- (1)
- 如上expect安装后的路径是:
- [root@xw4 ~]# which expect
- /usr/local/bin/expect
- (2)
- 做个expect执行文件的软件
- [root@xw4 ~]# ln -s /usr/local/bin/expect /usr/bin/expect
- [root@xw4 ~]# ll /usr/bin/expect
- (3)
- 编写expect脚本:
- -----------------------------------------------------------------------------------
- 1)
- [root@xw4 ~]# cat sshkey.exp
- #!/usr/bin/expect
- #sshkey.exp
- if {$argc<3} {
- puts stderr "Usage: $argv0 host user passwd "
- exit 1
- }
- set host [ lindex $argv 0 ]
- set user [ lindex $argv 1 ]
- set pwd [ lindex $argv 2 ]
- set timeout 30
- #spawn ssh ${user}@${host} "rm -rf ~/.ssh/id_rsa*"
- #
- #expect {
- # "*yes/no" { send "yes\r"; exp_continue }
- # "*password:" { send "$pwd\r"; exp_continue }
- #}
- spawn ssh ${user}@${host} "ssh-keygen -t rsa"
- expect {
- "*yes/no" { send "yes\r"; exp_continue }
- "*password:" { send "$pwd\r"; exp_continue }
- "Enter file in which to save the key*" { send "\n\r"; exp_continue }
- "Overwrite*" { send "y\n"; exp_continue }
- "Enter passphrase (empty for no passphrase):" { send "\n\r"; exp_continue }
- "Enter same passphrase again:" { send "\n\r" }
- }
- spawn ssh ${user}@${host} "cat ~/.ssh/id_rsa.pub"
- expect {
- "*yes/no" { send "yes\r"; exp_continue }
- "*password:" { send "$pwd\r" }
- }
- expect eof
- ----------------------------------------------------------------------------------------------------
- 2)
- [root@xw4 ~]# cat noscp.exp
- #!/usr/bin/expect
- #noscp.exp
- if {$argc<4} {
- puts stderr "Usage: $argv0 localfile remotefile user passwd "
- exit 1
- }
- set localfile [ lindex $argv 0 ]
- set remotefile [ lindex $argv 1 ]
- set user [ lindex $argv 2 ]
- set pwd [ lindex $argv 3 ]
- set timeout 30
- spawn scp ${localfile} ${user}@${remotefile}
- expect {
- "*yes/no" { send "yes\r"; exp_continue }
- "*password:" { send "$pwd\r" }
- }
- expect eof
- ------------------------------------------------------------------------
- [root@xw4 ~]# chmod 755 sshkey.exp
- [root@xw4 ~]# chmod 755 noscp.exp
- (4)
- 脚本说明
- ./sshkey.exp 主机名 用户名 密码 (在远程主机生成id_rsa)
- ./noscp.exp 本地文件 远程路径 远程用户密码 (无密码拷贝文件)
- (5)验证:
- [root@xw4 ~]# ./sshkey.exp 192.168.1.201 root PASSWORD |grep ssh-rsa >> ~/.ssh/authorized_keys
- [root@xw4 ~]# ./noscp.exp ~/.ssh/authorized_keys 192.168.1.201:~/.ssh root PASSWORD
- spawn scp /root/.ssh/authorized_keys root@192.168.1.201:~/.ssh
- root@192.168.1.201's password:
- authorized_keys
- 这样,就能无密码登陆了!
- [root@xw4 ~]# ssh 192.168.1.201
- Last login: Fri Sep 23 18:33:21 2016 from 192.168.1.7
- [root@vm-002 ~]#
- --------------------------------------------------------------------------
- 如果是多台机器的话,可以结合shell脚本进行批量执行
- [root@xw4 ~]# cat /root/ip.list
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
- 192.168.1.103
- 192.168.1.104
- ......
- ......
- [root@xw4 ~]# cat sshkey.sh
- #!/bin/bash
- user='root'
- password='PASSWORD'
- for ip in `cat /root/ip.list`
- do
- /root/sshkey.exp $ip $user $password |grep ssh-rsa >> ~/.ssh/authorized_keys
- /root/noscp.exp ~/.ssh/authorized_keys $user@$ip:~/.ssh root PASSWORD
- done
其他
dispatch_copy.exp
- #! /usr/local/bin/expect
- if { $argc != 3 } {
- send_user "usage :expect dispatch_sshkey.expect file host dest \n"
- }
- #define var
- set timeout 3
- set file [lindex $argv 0]
- set host [lindex $argv 1]
- set dest [lindex $argv 2]
- set password "hhh"
- #spawn scp /home/omd/2017-08-23 root@192.168.25.137:/home/omd
- #spawn scp -P11544 $file root@$host:$dir
- #spawn ssh-copy-id -i $file "-p 11544 root@$host:$dir"
- #spawn ssh-copy-id -i .ssh/id_dsa.pub omd@192.168.25.137
- spawn scp $file oldgirl@$host:$dest
- expect of {
- #timeout 1
- "yes/no" {send "yes\r"}
- "*password" {send "$password\r"}
- timeout {puts "Expect was timeout please contact ftl at XXXXX"; return}
- }
- exit -onexit {
- send_user "good bye!! see you \n"
- }
dispatch-sshkey.exp
- #! /usr/local/bin/expect
- if { $argc !=2 } {
- send_user "usage :expect dispatch_sshkey.expect file host \n"
- exit
- }
- #define var
- set file [lindex $argv 0]
- set host [lindex $argv 1]
- set password "hhh"
- #spawn scp /home/omd/2017-08-23 root@192.168.25.137:/home/omd
- #spawn scp -P11544 $file root@$host:$dir
- #spawn ssh-copy-id -i $file "-p 11544 root@$host:$dir"
- #spawn ssh-copy-id -i .ssh/id_dsa.pub omd@192.168.25.137
- spawn ssh-copy-id -i $file oldgirl@$host
- expect {
- "yes/no" {send "yes\r";exp_continue}
- "*password" {send "$password\r"}
- }
- expect eof
dispatch-sshkey2.exp[更完善]
- #! /usr/local/bin/expect
- if { $argc !=2 } {
- send_user "usage :expect dispatch_sshkey.expect file host \n"
- exit
- }
- #define var
- set timeout 1
- set file [lindex $argv 0]
- set host [lindex $argv 1]
- set password "hhh"
- #spawn scp /home/omd/2017-08-23 root@192.168.25.137:/home/omd
- #spawn scp -P11544 $file root@$host:$dir
- #spawn ssh-copy-id -i $file "-p 11544 root@$host:$dir"
- #spawn ssh-copy-id -i .ssh/id_dsa.pub omd@192.168.25.137
- spawn ssh-copy-id -i $file oldgirl@$host
- expect {
- #timeout 1
- "yes/no" {send "yes\r";exp_continue}
- "*password" {send "$password\r"}
- timeout {puts "Expect was timeout "; return}
- }
- expect eof
- exit -onexit {
- exec rm $tmpfile
- send_user "good bye\n"
- }
Linxu下 expect的实用实例_1的更多相关文章
- Linxu下 expect的安装与使用
expect学习 1.什么是except Expect是基于Tcl的一个相对简单的免费脚本文件语言工具,用于实现自动和交互式程序进行通信 is a software ...
- jQuery UI 入门之实用实例分享
jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...
- jQuery UI 入门之实用实例
jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...
- linux下expect环境安装以及简单脚本测试
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...
- Ubuntu下三个实用的录屏软件
Ubuntu下三个实用的录屏软件 Kazam 优点: 易安装 可选择区域录制,也可全屏录制 有录屏和截图功能 安装: sudo apt-get install kazam 展示: Simple Scr ...
- Linux 下 expect 脚本语言中交互处理常用命令
Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...
- expect基础及实例
expect基础及实例 http://blog.csdn.net/zhuying_linux/article/details/6900805
- Linxu下Yii2的POST请求被拒经历
Linxu下Yii2的POST提交被拒经历 介于对Yii2的使用,浅谈一下自己的经验,在以往的项目中我使用的框架是Yii1,由于Yii2的出现,所以极力的想使用一下它的新特性. 我的使用环境Linux ...
- Linux下 expect 使用详解与实例
一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expec ...
随机推荐
- 033-JsonUtils 工具类模板
模板一:使用的是jackson package cn.e3mall.common.utils; import java.util.List; import com.fasterxml.jackson. ...
- 【LDAP】LDAP常用命令解析
ldapadd -x 进行简单认证-D 用来绑定服务器的DN-h 目录服务的地址-w 绑定DN的密码-f 使用ldif文件进行条目添加的文件例子 ldapadd -x -D &qu ...
- [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例
前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...
- Intellij Idea快捷鍵
一.视图查看 Ctrl+F12 查看file,method结构图.类继承机构图 (不知道方法结构,Ctrl+F12一下,方法,参数,返回值,一清二楚的展现出来) Ctrl+shift+Alt+U ...
- Python制作回合制手游外挂简单教程(中)
接着上篇的博文,今天我们讲如何实现自动组队刷道 引入: 自动组队刷道的流程是先点击刷道按钮.再点击前往按钮.再点击便捷组队······ 这些操作上篇博文已经告诉我们怎么做了,利用picpick丈量坐标 ...
- JS常用时间处理方法
这里会扩展一些JS常用时间处理方法,内置时间对象的方法不再赘述 -- 传送门:http://www.w3school.com.cn/js/jsref_obj_date.asp 时间格式化 -- 转换为 ...
- [转]Composite Keys With WebApi OData
本文转自:http://chris.eldredge.io/blog/2014/04/24/Composite-Keys/ In our basic configuration we told the ...
- C# 视频转换类
using System.Web; using System.Configuration; namespace DotNet.Utilities { public class VideoConvert ...
- Spring定时(任务)刷新-quartz
Quartz是一个完全由java编写的开源作业调度框架.他可以与J2EE.J2SE集成,用与处理定时任务.定时刷新的需求.此处使用为与Spring项目集成. 在SpringMVC项目中使用quartz ...
- T4模板的一些配置(从EF数据更新)
<#@ template debug="false" hostspecific="false" language="C#" #> ...