案例

例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的更多相关文章

  1. Linxu下 expect的安装与使用

    expect学习 1.什么是except        Expect是基于Tcl的一个相对简单的免费脚本文件语言工具,用于实现自动和交互式程序进行通信            is a software ...

  2. jQuery UI 入门之实用实例分享

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  3. jQuery UI 入门之实用实例

    jQuery UI 入门 jQuery UI 简介 jQuery UI 是一个建立在 jQuery JavaScript 库上的小部件和交互库,您可以使用它创建高度交互的 Web 应用程序.无论您是创 ...

  4. linux下expect环境安装以及简单脚本测试

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...

  5. Ubuntu下三个实用的录屏软件

    Ubuntu下三个实用的录屏软件 Kazam 优点: 易安装 可选择区域录制,也可全屏录制 有录屏和截图功能 安装: sudo apt-get install kazam 展示: Simple Scr ...

  6. Linux 下 expect 脚本语言中交互处理常用命令

    Linux 下 expect 脚本语言中交互处理常用命令 1. #!/usr/bin/expect 告诉操作系统脚本里的代码使用那一个 shell 来执行.这里的 expect 其实和 Linux 下 ...

  7. expect基础及实例

    expect基础及实例 http://blog.csdn.net/zhuying_linux/article/details/6900805

  8. Linxu下Yii2的POST请求被拒经历

    Linxu下Yii2的POST提交被拒经历 介于对Yii2的使用,浅谈一下自己的经验,在以往的项目中我使用的框架是Yii1,由于Yii2的出现,所以极力的想使用一下它的新特性. 我的使用环境Linux ...

  9. Linux下 expect 使用详解与实例

    一.概述 我们通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能.而Expec ...

随机推荐

  1. Cloudera Manager安装之利用parcels方式(在线或离线)安装3或4节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(五)

    前期博客 Cloudera Manager安装之Cloudera Manager 5.6.X安装(tar方式.rpm方式和yum方式) (Ubuntu14.04) (三) 如果大家,在启动的时候,比如 ...

  2. linux mint 18.2 install postgresql

    https://www.postgresql.org/download/linux/ubuntu/ 1 check Xenial16.04 2  创建文件  /etc/apt/sources.list ...

  3. 向div添加圆角边框

    初级参数:border-radius: 4px;中级参数:border-radius: 4px 6px 6px 4px;终极参数:border-radius: 5px 5px 3px 2px / 5p ...

  4. JVM的类加载时机

    类加载过程中每个步骤的顺序 我们已经知道,类加载的过程包括:加载.连接.初始化,连接又分为:验证.准备.解析,所以说类加载一共分为5步:加载.验证.准备.解析.初始化. 其中加载.验证.准备.初始化的 ...

  5. mock时忽略不必要的初始化

    PowerMockito.mockStatic时忽略加载类的静态field,比如想PowerMockito.mockStatic(ClassA.class),ClassA如下 public class ...

  6. 使用ehCache作为本地缓存

    package nd.sdp.basic.config; import org.springframework.cache.CacheManager; import org.springframewo ...

  7. 开始使用 Vuejs 2.0 ---简单总结2

    Vuejs的常用指令 v-html v-show v-if v-for v-on 1 .v-html v-html 更新元素或者变量的innerHTML,按普通html解析,和v-text的区别是在变 ...

  8. ubuntu 10.10 更新源

    deb http://mirrors.163.com/ubuntu/ maverick main universe restricted multiverse deb-src http://mirro ...

  9. 吴恩达《深度学习》第五门课(1)循环序列模型(RNN)

    1.1为什么选择序列模型 (1)序列模型广泛应用于语音识别,音乐生成,情感分析,DNA序列分析,机器翻译,视频行为识别,命名实体识别等众多领域. (2)上面那些问题可以看成使用(x,y)作为训练集的监 ...

  10. WPF: RenderTransform特效

    WPF中的变形(RenderTransform)类是为了达到直接去改变某个Silverlight对象的形状(比如缩放.旋转一个元素)的目的而设计的,RenderTransform包含的变形属性成员就是 ...