linux shell脚本批量创建公钥

linux shell脚本批量创建公钥

为实现对多台服务器部署服务,如果只用交互方式输入密码,耗时耗力,因此必须考虑自动化部署,查询资料发现expect方式可以实现。

一、介绍

expect脚本是Tcl脚本语言的拓展。用来实现自动的交互式任务,无需人为干预。在实际开发中,运行shell脚本有时候会输入linux密码或者是mysql密码等,而expect可以帮我们输入。

二、安装

expect在linux系统中没有自带,需要我们自行安装,在centos系统下,安装命令如下

yum install expect -y

三、常用命令说明

命令说明
set timeout n设置expect语句超时时间为n秒。-1为永不超时
set name value设置变量名为name,其值为value
set name [lindex $argv 0]设置变量名为name,其值为 传入 expect脚本的第一个 参数 。第一个参数的索引值为0,第二个为1,依次类推
spawn启动新的进程,执行命令或者指定程序
expect接收进程中返回的信息, 如果匹配成功(有大小写区分), 就执行expect后的动作
send向进程发送字符串
send_user用来打印信息,相当于shell中的echo
exp_continue执行完expect后的动作后,使expect不退出,继续往下匹配
expect eof不允许用户交互,直接退出(这个用的会比interact多)
interact允许用户交互

四、案例

#!/usr/bin/bash
# 利用expect实现批量公钥的传送,方便后续批量部署
>ip.txt
password=1111
# user=ljw
#判断公钥是否存在,不存在创建
if [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -P "" -f ~/.ssh/id_rsa
fifor i in {12..16}
do{ip=192.168.10.$iping -c1 -W1 $ip &>/dev/nullif [ $? -eq 0 ];thenecho "$ip" >> ip.txt/usr/bin/expect <<-EOFset timeout 10  spawn ssh-copy-id $ipexpect {"yes/no" { send "yes\r"; exp_continue }"password:" {send "$password\r"}}expect eofEOFfi}&      #后台执行
done
wait

解释:
#!/bin/bash => shell脚本执行,如果不需要shell,而是全部expect,则可以:#!/usr/bin/expect

/usr/bin/expect <<-EOF => 此处开始执行expect脚本,记住EOF前面的“-”

expect中最关键的四个命令是send,expect,spawn,interact。

send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出

1、spawn命令是Expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法再进行下去了

spawn ssh-copy-id $ip; =>启动expect操作进程

2、expect 是针对需要交互的地方进行自动发送消息,{ 大扣号前面必须要有空格,前面引号内的内容是交互界面等待输入的匹配字串,{} 内的是交互输入的内容:

a、send 发送数据,最后的\r必需,说明输入密码并回车了

b、exp_continue 继续处理下一步命令

expect eof =>此命令和spawn 是匹配的,spawn进程结束后会向expect发送eof,表示退出spwan

EOF 解除expect脚本执行,跳出到shell执行环境

五、 <<EOF和<<-EOF的区别

在我们使用cat <<EOF时,我们输入完成后,需要在一个新的一行输入EOF结束stdin的输入。EOF必须顶行写,前面不能用制表符或者空格。

比如,下面的语句就不会出错:

cat <<EOF  
Hello,world!  
EOF

如果结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入。
<<-就是为了解决这一问题:

cat <<-EOF  
Hello,world!  EOF

上面的写法,虽然最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

api与sdk

API/SDK API &#xff08;Application Programming Interface&#xff09;应用程序接口SDK&#xff08;Software Development Kit &#xff09;软件开发工具包api就是一个接口&#xff0c;指向应用程序&#xff0c;一般是通过这个接口能够获得这个应用程序的产生或者处理的数据…

MRI骨水肿是早期未分化关节炎演变为RA的独立预测预测因素

原文 译文 Arthritis & Rheumatism DOI: 10.1002/art.30396 MRI bone edema is an independent predictor of development of rheumatoid arthritis in patients with early undifferentiated arthritis 1. Anne Duer-Jensen MD1,*,†, 2. Kim Hrslev-…

linux之awk超详解

linux之awk详解 1、awk简介 awk是一种编程语言&#xff0c;用于linux下对文本和数据进行处理。数据可以来来自标准输入、一个或多个文件&#xff0c;或其他命令的输出。 更多作为脚本来使用。 awk处理数据的方式&#xff1a;逐行扫描文件&#xff0c;寻找匹配的特定模式的行…

Windows2003 企业版 + Sql Server2005手工调整数据库服务器内存

最近犯了一个大的错误&#xff0c;总以为Windows2003 能够合理的使用多余的内存&#xff0c;能够智能化处理内存&#xff0c;事实非然。事情是这样的&#xff0c;我有一台数据库服务器&#xff0c;32位&#xff0c;操作系统是Windows2003企业版&#xff0c;4G内存&#xff0c;3…

docker搭建postgresql 14主从库 及使用shell脚本备份数据库

docker搭建postgresql 14主从库 及使用shell脚本备份数据库 1、地址规划 IP地址名称备注192.168.1.11pg1主库192.168.1.21pg2从库 2、安装部署主库 [rootcn01 ~]# mkdir -p /data/postgressql/data [rootcn01 ~]# docker run --name pgtest --restartalways -v /data/postgr…

VC程序中运行其他程序的三种方法

有三个函数可以使用: WinExec, ShellExecute,CreateProcess 1.WinExec(String lpCmdLine,Long nCmdShow); 参数说明: 参数类型及说明lpCmdLineString&#xff0c;包含要执行的命令行nCmdShowLong&#xff0c;为窗口指定可视性方面的一个命令。请用下述任何一个常数SW_HIDE隐藏窗…

linux shell 判断主机三次存活之批量探测

linux shell 判断主机三次存活之批量探测 在生产环境中&#xff0c;需要查看主机在线情况&#xff0c;之前都是采用执行一次ping命令的方式去操作&#xff0c;会丢失某些存活主机&#xff0c;故改进了脚本采用ping三次的方式进行操作。 #for 语句 #&#xff01;/bin/bash ip_…

linux中单引号、双引号

linux中单引号与双引号的区别和用法 1、单引号 单引号定义为所见即所得&#xff0c;单引号内部的内容原样输出&#xff0c;被单引号引起来的内容不管时变量还是常量都不会发生替换 #在表示连续字符串时&#xff0c;单引号、双引号、无引号都是一样的 [rootcn21 ~]# str1&quo…

多媒体融合通信平台促进公网和专网的互联互通

在发生诸如地震、洪涝灾害以及极端天气的情况下&#xff0c;由于通信设施和电力设施最容易遭到破坏&#xff0c;因此&#xff0c;在进行应急救援时&#xff0c;相关指挥部门最先想到的就是进行相应设施的抢修。 公网抢修成功&#xff0c;所有相关抢险救灾者都可以实现互相通话&…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如&#xff1a;es6 想要系统学习&#xff1a; 大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&…

Linux之shell中的大括号、中括号、小括号的使用详解

Linux之shell中的大括号、中括号、小括号的使用详解及示例 **摘要&#xff1a;**很多人和我一样对于shell的各种括号的各种用法肯定不是很清楚&#xff0c;有时候看见别人脚本都不知道是什么意思&#xff0c;今天就来说说bash中的大中小括号的用法和解释&#xff0c;本人常用b…

利用Visio 2007图形化项目进度和项目跟踪

课程类型 Microsoft Office Visio 2007 视频时长 120分钟 播放 课程资料 课程简介&#xff1a; 在进行项目管理时&#xff0c;项目经理将使用Microsoft Project对项目进行规划、资源分配、成本控制和项目状态跟踪。但是&#xff0c;项目中的数据如何能够通过更图形化的方式呈…

初学者看看PHP explode() 函数 第6篇

PHP explode() 函数 定义和用法 explode() 函数把字符串分割为数组。 语法 explode(separator,string,limit)参数 描述 separator 必需。规定在哪里分割字符串。 string 必需。要分割的字符串。 limit 可选。规定所返回的数组元素的最大数目。 说明 本函数返回由字符串组成的…

linux 备份文件滚动删除

linux 备份文件滚动删除 摘要&#xff1a;在实际的生产环境中&#xff0c;需要我们不断的备份文件&#xff0c;但是受到磁盘空间的影响&#xff0c;只能保留最新的备份文件。 1、只保存最近n天的文件 [rootcn01 test1]# ll 总用量 0 drwxr-xr-x 2 root root 6 2月 14 2020 …

jQuery常用方法总结(转)

jQuery 常见操作实现方式 $("标签名") //取html元素 document.getElementsByTagName("") $("#ID") //取单个控件document.getElementById("") $("div #ID") //取某个控件中 控件 $("#ID #ID") // 通过控件ID取其中…

K8s集群部署(最新版)

K8s集群部署&#xff08;最新版&#xff09; 1、部署k8s的两种方式&#xff1a; 本次实验采用kubeadm工具来部署Kubernetes集群。 Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部署Kubernetes集群。 2、环境准备 服务器要求&a…

VRP 的发展

随着网络技术和应用的飞速发展&#xff0c;VRP 平台在处理机制、业务能力、产品支持等方面也在持续演进。由于平时也接触到了这几个版本的平台&#xff0c;也常不知道所以然&#xff0c;特找了些资料整理了一下。主要列举了VRP 发展历程中的几个主要版本。 VRP 发展历程 各版本…

Harbor私有仓库部署(最新)

Harbor私有仓库部署&#xff08;最新&#xff09; [rootK8s-Master ~]#yum install wget -y [rootK8s-Master ~]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo #docker-ce国内yum源 [rootK8s-Master ~]#yum -y…

K8S使用habor作为私有仓库

K8S使用habor作为私有仓库 1、修改每个node上的docker认证仓库 # 将每个node节点上的docker同样需要配置可信任仓库 vi /etc/docker/daemon.json #修改为 { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"], "insecure-registries&qu…