日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)SSH批量分发管理非交互式expect 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

  • 1 SSH批量分發管理
    • 1.1 測試環境
    • 1.2 批量管理步驟
    • 1.3 批量分發管理實例
      • 1.3.1 利用sudo提權來實現沒有權限的用戶拷貝
      • 1.3.2 利用sudo提權開發管理腳本
      • 1.3.3 利用rsync來實現增量備份
    • 1.4 SSH批量管理分發腳本實戰
    • 1.5 SSH批量管理總結
  • 2 非交互式expect
    • 2.1 非交互式生成密鑰及實現批量管理
    • 2.2 一鍵批量安裝httpd服務
    • 2.3 一鍵自動化50臺規模集群網站

?

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、測試

測試成功的話連接后就不用密碼了

[root@m01 ~]# useradd oldgirl [root@m01 ~]# echo 123456|passwd --stdin oldgirl 更改用戶 oldgirl 的密碼 。 passwd: 所有的身份驗證令牌已經成功更新。 [root@m01 ~]# id oldgirl uid=501(oldgirl) gid=501(oldgirl) 組=501(oldgirl) [root@m01 ~]# su - oldgirl [oldgirl@m01 ~]$ 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 oldgirl@m01 The key's randomart image is: +--[ DSA 1024]----+ | ..o .. | | o .. | | . . | | . ... o | | ..o.S . | | . .=.= | | .. ..+ | | o .oo | | Eo=o | +-----------------+ [oldgirl@m01 ~]$ 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 oldgirl@x.x.x.x 改端口:ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldgirl@x.x.x.x" #測試 [oldgirl@m01 ~]$ ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0 [oldgirl@m01 ~]$ ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0 [oldgirl@m01 ~]$ ssh oldgirl@172.16.1.41 /sbin/ifconfig eth0 #若要批量查看每個系統的版本,可以直接寫成腳本,把上面的三條命令都寫成腳本然后執行。 vi ssh.sh ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0 ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0 ssh oldgirl@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端口最好都一致

#一個簡單的可以讓所有服務器執行命令的腳本 [oldgirl@m01 scripts]$ cat ssh_view.sh #!/bin/bash . /etc/init.d/functionsexport PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldgirl/binif [ $# -ne 1 ];then echo "USAGE:$0 ARG" exit 1 fi #由于我的端口沒有一致,故只測試31這一個改過端口的服務器 for n in 31 do echo =============172.16.1.$n============= ssh -p52113 oldgirl@172.16.1.$n "$1" done #######測試 [oldgirl@m01 scripts]$ bash ssh_view.sh "cat /etc/redhat-release" =============172.16.1.31============= CentOS release 6.9 (Final) [oldgirl@m01 scripts]$ bash ssh_view.sh "tail -1 /etc/inittab" =============172.16.1.31============= id:3:initdefault: #可以批量管理服務器的拷貝文件的腳本 [oldgirl@m01 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 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\ #備份,可以不做 #ssh -t oldgirl@172.16.1.${n} sudo /usr/bin/rsync /etc/hosts /etc/hosts_$(date +%F-%H:%M:%S) ssh -t oldgirl@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

  • 追求安全建議選2

  • 有能力可以用puppet、saltstack。

  • 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 oldboy@$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" } [oldboy@m01 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 自動分發腳本 [oldboy@m01 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 oldboy@192.168.90.$n:~ done #install service for m in 128 129 do ssh -t oldboy@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

    總結

    以上是生活随笔為你收集整理的(转)SSH批量分发管理非交互式expect的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。