bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


expect工具可以实现自动应答,从而达到非交互的目的。

expect具体使用用法比较复杂,中文手册我正在翻译中,以后翻译完了做了整理再补。本文只有几个ssh相关最可能用上的示例。

yum -y install expect

1.1 scp自动应答脚本

以下是scp自动问答的脚本。

[root@xuexi ~]# cat autoscp.exp
#!/usr/bin/expect
###########################################################
# description: scp without interactive #
# author : 骏马金龙 #
# blog : http://www.cnblogs.com/f-ck-need-u/ #
########################################################### set timeout
set user_hostname [lindex $argv ]
set src_file [lindex $argv ]
set dest_file [lindex $argv ]
set password [lindex $argv ]
spawn scp $src_file $user_hostname:$dest_file
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof

用法:autoscp.exp [user@]hostname src_file dest_file [password]

该自动回答脚本可以自动完成主机验证和密码认证,即使已经是实现公钥认证的机器也没问题,因为公钥认证机制默认优先于密码认证,且此脚本的password项是可选的,当然,在没有实现公钥认证的情况下,password是必须项,否则expect实现非交互的目的就失去意义了。

以下是几个示例:

[root@xuexi ~]# ./autoscp.exp 172.16.10.6 /etc/fstab /tmp
spawn scp /etc/fstab 172.16.10.6:/tmp
The authenticity of host '172.16.10.6 (172.16.10.6)' can't be established.
RSA key fingerprint is f3:f8:e2::b4:b1::0d:5b::3b::d9:3a:f0:cf.
Are you sure you want to continue connecting (yes/no)? yes # 主机验证时询问是否保存host key,自动回答yes
Warning: Permanently added '172.16.10.6' (RSA) to the list of known hosts.
root@172.16.10.6's password: # 密码认证过程,自动回答指定的密码"123456"
fstab % .8KB/s :

也可以指定完成的用户名和主机名。

[root@xuexi ~]# ./autoscp.exp root@172.16.10.6 /etc/fstab /tmp
spawn scp /etc/fstab root@172.16.10.6:/tmp
root@172.16.10.6's password:
fstab % .8KB/s :

1.2 ssh-copy-id自动应答脚本

以下是在建立公钥认证机制时,ssh-copy-id拷贝公钥到服务端的自动应答脚本。

[root@xuexi ~]# cat /tmp/autocopy.exp
#!/usr/bin/expect ###########################################################
# description: scp without interactive #
# author : 骏马金龙 #
# blog : http://www.cnblogs.com/f-ck-need-u/ #
########################################################### set timeout
set user_hostname [lindex $argv ]
set password [lindex $argv ]
spawn ssh-copy-id $user_hostname
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect eof

用法:autocopy.exp [user@]hostname password

以下是一个示例,

[root@xuexi ~]# /tmp/autocopy.exp root@172.16.10.6
spawn ssh-copy-id root@172.16.10.6
The authenticity of host '172.16.10.6 (172.16.10.6)' can't be established.
RSA key fingerprint is f3:f8:e2::b4:b1::0d:5b::3b::d9:3a:f0:cf.
Are you sure you want to continue connecting (yes/no)? yes # 主机认证时,自动应答yes
Warning: Permanently added '172.16.10.6' (RSA) to the list of known hosts.
root@172.16.10.6's password: # 密码认证时自动输入密码"123456"
Now try logging into the machine, with "ssh 'root@172.16.10.6'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.

1.3 批量ssh-copy-id自动应答

如果要实现批量非交互,则可以写一个shell脚本调用该expect脚本。例如:

[root@xuexi ~]# cat /tmp/sci.sh
#!/bin/bash ###########################################################
# description: scp without interactive #
# author : 骏马金龙 #
# blog : http://www.cnblogs.com/f-ck-need-u/ #
########################################################### passwd= # 指定要传递的密码为123456
user_host=`awk '{print $3}' ~/.ssh/id_rsa.pub` # 此变量用于判断远程主机中是否已添加本机信息成功 for i in $@
do
/tmp/autocopy.exp $i $passwd >&/dev/null
ssh $i "grep "$user_host" ~/.ssh/authorized_keys" >&/dev/null # 判断是否添加本机信息成功
if [ $? -eq ];then
echo "$i is ok"
else
echo "$i is not ok"
fi
done

用法:/tmp/sci.sh [user@]hostname

其中hostname部分可以使用花括号展开方式枚举。但有个bug,最好ssh-copy-id的目标不要是脚本所在的本机,可能会强制输入本机密码,但批量脚本autocopy.exp则没有此bug。

例如:

[root@xuexi tmp]# /tmp/sci.sh 172.16.10.3 172.16.10.6
172.16.10.3 is ok
172.16.10.6 is ok
[root@xuexi tmp]# /tmp/sci.sh 172.16..{,}
172.16.10.3 is ok
172.16.10.6 is ok
[root@xuexi tmp]# /tmp/sci.sh root@172.16.10.3 172.16.10.6
root@172.16.10.3 is ok
172.16.10.6 is ok

expect实现scp/ssh-copy-id非交互的更多相关文章

  1. 用expect实现SCP/SSH自动输入密码登录

    在命令行ssh远程登录服务器和scp远程传输文件都需要交互式输入密码,无法像mysql登录数据库 mysql -uroot -p123456一样直接完成. 其实可以用脚本依赖expect来达到这一目的 ...

  2. sshpass-Linux命令之非交互SSH密码验证

    sshpass-Linux命令之非交互SSH密码验证 参考网址:https://www.cnblogs.com/chenlaichao/p/7727554.html ssh登陆不能在命令行中指定密码. ...

  3. 【转】sshpass-Linux命令之非交互SSH密码验证

      sshpass-Linux命令之非交互SSH密码验证 ssh登陆不能在命令行中指定密码.sshpass的出现,解决了这一问题.sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次 ...

  4. 通过scp拷贝文件时无需交互输入密码

    工作中经常需要把一些文件从一个服务器传输到另一台服务器,linux环境下最习惯的方式当然是scp,但是scp需要交互输入密码有时候觉得麻烦,记录几种无需手动输入密码的方法. 方法一:建立SSH互信 此 ...

  5. 浅记初次使用expect、scp中出现的一些小问题

    以前也学过一些shell,不过学得并不是很深入,动手写的代码的时间也不是很多.前不久将shell比较细的过了一遍,leader布置了任务让用shell写一个脚本将redis源码压缩包从一个服务器上传到 ...

  6. 【原创】jssh linux scp ssh 免密登录开源工具

    项目名 JSSH git地址: https://gitee.com/chejiangyi/jssh 项目介绍 linux scp(文件上传,下载) shell命令的java ssh jar和linux ...

  7. ssh秘钥免交互批量分发脚本

    将以下内容保存为.sh文件后运行即可,需根据各自情况修改ip_up和ip_arr #!/bin/bash #脚本功能:ssh秘钥免交互批量分发 #制 作 人:罗钢 联系方式:278554547@qqc ...

  8. hadoop(五)scp命令copy文件和配置(完全分布式准备二)|7

    机器的克隆参考centos7克隆ip|机器名|映射关系|别名配置(hadoop完全分布式准备一) 那么问题来了,如果我们有30台机器,之间可以互相访问,那我们如何快速安装配置环境如jdk hadoop ...

  9. 无需输入密码的scp/ssh/rsync操作方法

    一般使用scp/ssh/rsync传输文件时,都需要输入密码.下面是免密码传输文件的方法. 假设要在两台主机之间传送文件,host_src & host_dst.host_src是文件源地址所 ...

随机推荐

  1. SpringMVC详解(二)------详细架构

    通过上篇博客,我们能编写一个 SpringMVC 的入门实例,但是为什么要这样写?这样写有啥好处?通过这篇博客我们会有详细的了解. 本篇博客源码下载链接:http://pan.baidu.com/s/ ...

  2. Java连接数据库的4中方式详解

    Java连接数据库的方式有多种:根据所需要的不同数据库驱动分,分为四种: 1:1类驱动.这就是JDBC-ODBC桥的方式. 但这种方式不适合程序的重用与维护,不推荐使用.需要数据库的ODBC驱动. 2 ...

  3. Maven详解(三)------ Maven工程目录介绍

    上一章我们配置并安装好了 Maven,那么这一章我们介绍如何用eclipse创建一个 Maven 工程,然后介绍 Maven 工程的目录结构. 1.eclipse 创建 Maven 工程 第一步:Fi ...

  4. js把星期由数字转换为星期名称

    //由星期的数字转换为星期的名称,date格式:2016-01-07,用"-"分割 function toWeekName(date) { var newDate = new Da ...

  5. JavaWeb(六)Listener监听器

    监听器 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. Servlet监听器 在Se ...

  6. Postman测试http接口

    一.安装 官网:https://www.getpostman.com/ Postman是一个Chrome的一个插件工具,我们可以通过Chrome的应用商店进行进行搜索并安装,安装完成会在桌面上显示一个 ...

  7. for循环 + setTimeout 结合的烂大街的面试题

    零.背景 最近在翻看以前的老书<node.js开发指南>,恰好碰到for循环 + setTimeout的经典例子,于是重新梳理了思路并记录下. 一.写在前面,setTimeout和setI ...

  8. [js高手之路]设计模式系列课程-单例模式实现模态框

    什么是单例呢? 单,就是一个的意思.例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如: ...

  9. 一位资深程序员大牛给予Java提升技术的学习路线建议

    15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...

  10. SessionStateMode之SQL Server共享session

    分布式应用首先要解决的是跨域的问题,解决session.frame.cookie的跨域是最基本的,然后才是负载均衡和性能优化,上面的不解决就没法往后面进行.上一博客主要是解决了frame跨域的问题,今 ...