(转)SSH批量分发管理&非交互式expect

目录

1 SSH批量分发管理

基于口令的,如何实现批量管理:expect、pssh、sshpass

期中架构分享

http://edu.51cto.com/course/course_id-4212.html

1.1 测试环境

m01(Server)

eth0:192.168.90.61/24 
eth1:172.16.1.61/24

nfs01(Client)

eth0:192.168.90.31/24 
eth1:172.16.1.31/24

backup(Client)

eth0:192.168.90.41/24 
eth1:172.16.1.41/24

web01(Client)

eth0:192.168.90.8/24 
eth1:172.16.1.8/24

1.2 批量管理步骤

1、创建用户及密码

2、m01创建密钥对

3、m01分发公钥

默认22端口可以不指定端口

若更改过的端口,需要指定-p端口

4、测试

测试成功的话连接后就不用密码了

[[email protected] ~]# useradd oldgirl
[[email protected] ~]# echo 123456|passwd --stdin oldgirl
更改用户 oldgirl 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
[[email protected] ~]# id oldgirl
uid=501(oldgirl) gid=501(oldgirl) 组=501(oldgirl)
[[email protected] ~]# su - oldgirl
[[email protected] ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/oldgirl/.ssh/id_dsa):
Created directory ‘/home/oldgirl/.ssh‘.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oldgirl/.ssh/id_dsa.
Your public key has been saved in /home/oldgirl/.ssh/id_dsa.pub.
The key fingerprint is:
bf:44:68:f3:eb:6b:03:28:45:21:24:fb:dd:e9:b0:cf [email protected]
The key‘s randomart image is:
+--[ DSA 1024]----+
|  ..o ..         |
|   o ..          |
|  .  .           |
|   . ... o       |
|    ..o.S .      |
|    . .=.=       |
|     .. ..+      |
|       o .oo     |
|        Eo=o     |
+-----------------+
[[email protected] ~]$ ll .ssh/
总用量 8
-rw------- 1 oldgirl oldgirl 668 2月  10 19:36 id_dsa        #钥匙
-rw-r--r-- 1 oldgirl oldgirl 601 2月  10 19:36 id_dsa.pub        #锁
#非交互式创建密钥
1、ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
2、echo -e "\n" | ssh-keygen -t dsa -N ""
#发送公钥(下面这个只能发送公钥)
没改端口:ssh-copy-id -i .ssh/id_dsa.pub [email protected]
改端口:ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 [email protected]"
#测试
[[email protected] ~]$ ssh -p 52113 [email protected]172.16.1.31 /sbin/ifconfig eth0
[[email protected] ~]$ ssh [email protected]172.16.1.8 /sbin/ifconfig eth0
[[email protected] ~]$ ssh [email protected]172.16.1.41 /sbin/ifconfig eth0
#若要批量查看每个系统的版本,可以直接写成脚本,把上面的三条命令都写成脚本然后执行。
vi ssh.sh
ssh -p 52113 [email protected]172.16.1.31 /sbin/ifconfig eth0
ssh [email protected]172.16.1.8 /sbin/ifconfig eth0
ssh [email protected]172.16.1.41 /sbin/ifconfig eth0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

1.3 批量分发管理实例

例:把所有服务器上的hosts解析文件给更新一遍,hosts文件内容如下

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web01
172.16.1.8      web02
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

企业里实现ssh的3种方案:

1、直接root ssh key。

条件:允许root ssh登录

2、利用sudo提权来实现没有权限的用户拷贝

3、利用suid来实现没有权限的用户拷贝(工作中不建议使用suid)

曲线救国的方式,可以先用scp把hosts文件拷贝到对方主机的家目录下,然后再给rsync或其它拷贝命令授权以suid(chmod u+s `which rsync`)。之后再用ssh连接执行远程拷贝功能(前提是rsync已经被授权suid)操作命令如下:

ssh -p 52113 hosts oldgirl@172.16.1.31:~
ssh -p 52113 oldgirl@172.16.1.31 /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2

1.3.1 利用sudo提权来实现没有权限的用户拷贝

指定一个用户,让他可以执行某个命令:

visudo
oldgirl ALL=(ALL) NOPASSWD:/usr/bin/rsync
  • 1
  • 2

自动化管理

echo "oldgirl   ALL=(ALL) NOPASSWD:/usr/bin/rsync" >>/etc/sudoers
visudo -c
  • 1
  • 2

实现远程sudo

两种方法: 
第一种:注释掉/etc/sudoers文件中的Defaults requiretty 
第二种(推荐):ssh 加-t选项,在执行远程ssh时可以打开终端,然后就可以sudo用了。

scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2

1.3.2 利用sudo提权开发管理脚本

[oldgirl@m01 ~]$ cat fenfa_file.sh
scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
scp hosts oldgirl@172.16.1.41:~
ssh -t oldgirl@172.16.1.41 sudo /usr/bin/rsync ~/hosts /etc/hosts
scp  hosts oldgirl@172.16.1.8:~
ssh -t oldgirl@172.16.1.8 sudo /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.3.3 利用rsync来实现增量备份

rsync -avz hosts -e ‘ssh -p 52113‘ oldgirl@172.16.1.31:~
  • 1

#这样的方法有两种好处

1、增量 
2、加密

工作中的跳板机(堡垒机)一定要保护的很安全,就是批量管理的机器

1、防火墙

2、监听内网

3、不给外网IP

4、ssh防护好,禁止root登录

1.4 SSH批量管理分发脚本实战

所有服务器端ssh端口最好都一致

#一个简单的可以让所有服务器执行命令的脚本
[[email protected] scripts]$ cat ssh_view.sh
#!/bin/bash
. /etc/init.d/functions

export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldgirl/bin

if [ $# -ne 1 ];then
    echo "USAGE:$0 ARG"
    exit 1
fi

#由于我的端口没有一致,故只测试31这一个改过端口的服务器
for n in 31
do
    echo =============172.16.1.$n=============
    ssh -p52113 [email protected]172.16.1.$n "$1"
done
#######测试
[[email protected] scripts]$ bash ssh_view.sh "cat /etc/redhat-release"
=============172.16.1.31=============
CentOS release 6.9 (Final)
[[email protected] scripts]$ bash ssh_view.sh "tail -1 /etc/inittab"
=============172.16.1.31=============
id:3:initdefault:
#可以批量管理服务器的拷贝文件的脚本
[[email protected] scripts]$ cat fenfa_file1.sh
#!/bin/bash
. /etc/init.d/functions
if [ $# -ne 2 ];then
    echo "USAGE:$0 ARG1 ARG2"
    exit 1
fi

for n in 8 41 31
do
  scp ~/$1 [email protected]172.16.1.${n}:~ >/dev/null 2>&1 &&  #备份,可以不做
#ssh -t [email protected]${n} sudo /usr/bin/rsync /etc/hosts /etc/hosts_$(date +%F-%H:%M:%S)
  ssh -t [email protected]172.16.1.${n} sudo /usr/bin/rsync ~/$1 $2 >/dev/null 2>&1
  if [ $? -eq 0 ];then
    action "fenfa hosts 172.16.1.$n" /bin/true
  else
    action "fenfa hosts 172.16.$n" /bin/false
  fi
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

1.5 SSH批量管理总结

1、利用root做ssh key验证。

优点:简单,易用

缺点:安全差,同时无法禁止root远程连接这个功能

企业应用:80%的中小企业。

2、利用普通用户如oldgirl来做

思路是先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝分发的文件到远程服务器的对应权限目录。

优点:安全。无需停止root远程连接这个功能。

缺点:配置比较复杂。

3、拓展:同方案2,只是不用sudo,而是设置suid对固定命令提权。

优点:相对安全

缺点:负载,安全性较差。任何人都可以处理带有suid权限的命令。

建议:

  1. 追求简单可以选1
  2. 追求安全建议选2
  3. 有能力可以用puppet、saltstack。
  4. suid:普通用户裕兴程序,没有权限时也可以suid,然后运行,必须是编译好的程序命令。

puppet:早起大网站使用的

saltstack(*):可以装客户端

ansible(*):优点:不用装客户端,直接ssh就可以

4、企业级生产场景批量管理,自动化管理方案:

1)最简单常用ssh key,功能最强大的。一般中小型企业会用,50-100台以下。

2)sina cfengine、puppet 较早的批量管理工具。现在基本上没有企业用。

3)门户级别比较流行的,puppet批量管理工具,复杂,笨重。

4)saltstack批量管理工具,特点:简单,功能强大(配置复杂),赶集网、小米等一些CDN公司会使用

5)http+cron

批量管理路线:ssh key–>cfengine–>puppet–>saltstack/ansible

轻松实现远程批量拷贝文件脚本博客:

http://blog.51cto.com/oldboy/1205715

SSH连接慢的解决:

http://blog.51cto.com/oldboy/1300964

2 非交互式expect

非交互式工具:expect(一门语言)、sshpass、pssh

expect:默认没有安装,需要先安装再使用

[root@m01 ~]# yum install expect -y
[root@m01 ~]# rpm -qa expect
expect-5.44.1.15-5.el6_4.x86_64
#装完expect后会附带一个随机密码生成工具mkpasswd
[root@m01 ~]# mkpasswd
tnhu1LM9$
[root@m01 ~]# mkpasswd
Y1]taHax9
[root@m01 ~]# mkpasswd -l 10   #-l 指定随机密码长度
GSg[yeyv10
[root@m01 ~]# mkpasswd -l 15
nb/Wayrtj9ww0vE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.1 非交互式生成密钥及实现批量管理

1、所有机器创建用户及密码
useradd oldgirl888
echo 123456|passwd --stdin oldgirl
id oldgirl888
su - oldgirl888
2、管理机创建密钥
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa >/dev/null 2>&1
3、自动分发密钥
vim fenfa_sshkey.exp
#!/usr/bin/expect
#

if { $argc != 2 } {
  send_user "Usage: expect fenfa_sshkey.exp file host \n"
  exit
}

#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"

spawn ssh-copy-id -i $file [email protected]$host
expect {
    "yes/no"    {send "yes\r";exp_continue}
    "*password" {send "$password\r"}
}
expect eof

exit -onexit {
  send_user "Oldboy say goodbye to you!\n"
}
[[email protected] scripts]$ expect fenfa_sshkey.exp ../.ssh/id_dsa.pub 172.16.1.41

一个脚本都分发:

cat /server/scripts/fenfa_sshkey.sh
#!/bin/bash
#
. /etc/init.d/functions

for i in 128 129
do
  expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1
  if [ $? -eq 0 ]
  then
    action "$i" /bin/true
  else
    action "$i" /bin/false
  fi
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

2.2 一键批量安装httpd服务

1、准备工作:
useradd oldboy
echo 123456|passwd --stdin oldboy
id oldboy
2、sudo提权实现没有权限用户拷贝
配置sudoers:
echo "oldboy ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
visudo -c
su - oldboy

自动分发脚本
[[email protected] scripts]$ cat sshkey_install.sh
#!/bin/bash
#
. /etc/init.d/functions

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

# Product key pair
ssh-keygen -t dsa -P ‘‘ -f ~/.ssh/id_dsa > /dev/null 2>&1
  if [ $? -eq 0 ];then
    action "Create dsa $ip" /bin/true
  else
    action "Create dsa $ip" /bin/false
    exit 1
  fi

#dis pub key
for i in 128 129
do
  expect ~/scripts/fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1
  if [ $? -eq 0 ];then
    action "$i" /bin/true
  else
    action "$i" /bin/false
  fi
done

#dis fenfa scripts
for n in 128 129
do
  scp -rp ~/scripts [email protected]192.168.90.$n:~
done

#install service
for m in 128 129
do
  ssh -t [email protected]192.168.90.$m sudo /bin/bash ~/scripts/install.sh
done

cat /scripts/install.sh
yum install httpd -y
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

2.3 一键自动化50台规模集群网站

思路: 
自动化的基础:

a.搭建yum仓库 
b.定制rpm包

1、ssh key + expect

a.kickstart无人值守安装Linux系统(自动创建用户、密码、优化) 
b.分发机上创建密钥对、批量发走公钥(expect) 
c.写安装优化脚本、批量发到各个服务器上,远程执行安装

2、高级架构师知识搞定的一套集群方案

a.cobbler无人值守安装Linux系统(自动创建用户、密码、优化、salt客户端) 
b.服务端salt上,创建认证,写配置来批量安装管理各个节点服务器应用。

3、高级架构师知识搞定的一套集群方案

a.kvm虚拟化、根据不同的业务提前做好镜像 
b.通过与计算工具OpenStack管理镜像,批量生成五个虚拟机 
c.服务端salt上,创建认证,写配置来批量安装管理各个节点服务器应用。

4、docker

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_rsq/article/details/79619793

原文地址:https://www.cnblogs.com/liujiacai/p/8684555.html

时间: 2024-10-14 04:20:40

(转)SSH批量分发管理&非交互式expect的相关文章

SSH批量分发管理

IT公司企业级批量分发\管理方案(分发,批量部署.执行命令.批量管理)1.中小企业最基本实用的sshkey密钥管理方案2.门户网站puppet (复杂,太重)sina3.赶集,小米SALSTACK批量管理(轻量) SSH server: 1.SSH服务 2.SFTP服务(vsftp,proftp)ssh client: 特别提醒:SSH客户端(ssh)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的. 知识小结:(openssh负责连接 openssl负责加密) 1.ssh是安

SSH批量分发与管理

一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输,确保了传递的数据安全. SSH是专为远程登录会话和其他网络服务提供的安全性协议.利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境当中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件.如telnet等. SSH服务结构: SSH服务是由服务端软件OpenSS

SSH认证原理和批量分发管理

SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [[email protected] ssh]# ls moduli ssh_config sshd_config ssh_host_dsa_key ssh_host_dsa_key.pub ssh_host_key ssh_host_key.pub ssh_host_rsa_key ssh_host_rsa_key.pub 其中,ssh_host_key和ssh_host_key.pub 用于ssh协议1版本:其

Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想.  作者:燁未央_Estelle声明:测试学习,不足之处,欢迎指正. 第一章 NFS共享服务器的企业应用 1.1 NFS服务--静态数据存储 NFS是(Network File System)主要功能是通过网络让不同的设备端之间可以彼此共享文件或目录.NFS客户端(一般为应用服务器,如WEB)可以通过挂载(mount)方式,将NFS客户端本地系统中(就是一个挂载点)从NFS服务器端共享的数据文件目

ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 功能

ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 第一部分:使用ssh key 实现服务器间的免密码交互登陆 步骤1: 安装openssh-clients [[email protected] ~]# yum install openssh-clients -y 步骤2: 创建用户,所有机器同时操作,可直接使用root [[email protected] ~]# useradd test #如果使用root,这里跳过 [[email protected] ~]# ec

ssh批量分发服务搭建

SSH批量分发服务 1. 系统环境 [[email protected] ~]# uname -a Linux A 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 2203:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [[email protected] ~]# ifconfig eth0 | grep 'inet addr' |awk'{print $2}'|awk -F':' '{print $2}' 10.0.0.3

Linux服务器集群架构部署搭建(三)NFS文件系统、SSH、批量分发管理、实时同步(2)

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想. 作者:燁未央_Estelle声明:测试学习,不足之处,欢迎指正. 第四章 部署配置inotfiy+rsync实时同步 4.1 实时同步inotfiy+rsync的操作步骤 ①备份服务器[email protected]运行rsync进程作为rsync的服务端.NFS作为rsync的客户端. ②在备份服务器安装并正常启动rsync进程服务.并设置修改配置文件.实现远程拉取.推送备份. ③在客户端N

7)SSH批量管理分发项目

ssh服务认证类型介绍 从SSH客户端来看,SSH服务主要提供两种级别的安全验证,具体级别如下: 基于口令的安全验证: 基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的SSH连接账号和口令,应用服务器的IP及开放的端口,默认为22,就可以通过SSH客户端登录到这台远程主机.此时,联机过程中所有传输的数据都是加密的. 基于口令的我们可以通过expect,pssh,sshpass实现批量管理. 期中集群:一键搭建及优化50台服务器集群 基于密钥的安全验证: 基于密钥的安全验证方式是指,需

SSH服务及批量分发与管理实战

SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输,确保了传递的数据安全. SSH是专为远程登录会话和其他网络服务提供的安全性协议.利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境当中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件.如telnet等. SSH服务功能: a.类似telnet远程