Linux SSH批量分發管理
原文:http://blog.51cto.com/chenfage/1831166
第1章 SSH服務基礎介紹
1.1 SSH服務
1.1.1SSH介紹
SSH是Secure Shell Protocol的簡寫,由IETF網絡工作小組制定;在進行數據傳輸之前,SSH先對聯機數據包通過加密技術進行加密處理,加密后再進行數據傳輸。
SSH是專為遠程登錄會話和其他網絡服務提供的安全性協議,利用SSH協議可以有效的防止遠程管理過程中的信息泄露問題,比telnet安全。
SSH服務主要提供兩個服務功能:
(1) 類似telnet遠程聯機服務器的服務,即SSH服務。
(2) 類似FTP服務的sftp-server,借助SSH協議來傳輸數據的,提供更安全的SFTP服務。
SSH客戶端還包含一個很有用的遠程安全拷貝命令:scp。
知識小結:
(1) SSH是安全的加密協議,用於遠程連接Linux服務器。
(2) SSH默認端口是22,有兩個版本:SSH1與SSH2。
(3) SSH服務端主要包含兩個服務功能:SSH遠程連接與SFTP服務。
(4) Linux SSH客戶端包含ssh遠程連接命令,以及遠程拷貝scp命令等。
1.1.2SSH相關軟件
[root@m01 ~]# rpm -qa openssh openssl #<==與SSH服務相關的兩個軟件
openssh-5.3p1-111.el6.x86_64 #<==提供遠程連接服務
openssl-1.0.1e-42.el6.x86_64 #<==提供加密服務
/etc/ssh/ssh_config #<==SSH客戶端配置文件
/etc/ssh/sshd_config #<==SSH服務端配置文件
1.1.3查看SSH服務
[root@m01 ~]# /etc/init.d/sshd status #<==查看ssh服務的運行狀態
openssh-daemon (pid 1273) 正在運行...
[root@m01 ~]# netstat -tunlp |grep -w"22" #<==對外偵聽的端口是tcp:22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1273/sshd
tcp 0 0 :::22 :::* LISTEN 1273/sshd
[root@m01 ~]# ps -ef |grep sshd #<==查看進程
root 1273 1 0 23:04 ? 00:00:00 /usr/sbin/sshd
root 1430 1273 0 23:37 ? 00:00:00 sshd: root@pts/0
root 1478 1432 0 23:47 pts/0 00:00:00 grep --color=auto sshd
[root@m01 ~]# lsof -i tcp:22 #<==對外偵聽的端口是tcp:22
COMMAND PIDUSER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1273root 3u IPv4 10360 0t0 TCP *:ssh (LISTEN)
sshd 1273 root 4u IPv6 10362 0t0 TCP *:ssh (LISTEN)
sshd 1430root 3r IPv4 11455 0t0 TCP 10.0.0.61:ssh->10.0.0.1:50158(ESTABLISHED)
1.2 SSH1.X的聯機過程
過程如下:
(1) 服務端先產生768字節的公鑰
(2) 客戶端主動發起請求
(3) 服務端將公鑰發給客戶端,客戶端利用公鑰計算機出獨一無二的私鑰,並將兩者整合成密鑰對(pair),再發送給服務端
(4) 之后,客戶與服務端就利用這獨一無二的密鑰對,來相互交流
[root@m01 ~]# grep Protocol /etc/ssh/sshd_config #<==協議為2
Protocol 2
[root@m01 ~]# grep ServerKey /etc/ssh/sshd_config #<==公鑰長度
#ServerKeyBits 1024
1.2.1客戶端第1次連接服務端
[root@s1 ~]# ssh 10.0.0.61 #<==客戶端第一次連接服務端時,沒有服務端的公鑰
The authenticity of host '10.0.0.61 (10.0.0.61)'can't be established.
RSA key fingerprint is6d:5c:ed:4e:74:5b:ad:0f:52:94:26:b5:44:57:1f:8f.
Are you sure you want to continue connecting(yes/no)? #<==所以會彈出這個對話框,我們要在這里輸入yes,再輸入服務端的密碼。
Warning: Permanently added '10.0.0.61' (RSA) tothe list of known hosts.
root@10.0.0.61's password: xxxxxx #<==輸入服務端的密碼
Last login: Wed Jul 27 00:00:38 2016 from 10.0.0.1
[root@m01 ~]# #<==遠程登錄成功
~在客戶端查看服務端的公鑰,最好再克隆一個窗口
[root@s1 ~]# ls ~/.ssh/ #<==服務端公鑰的存放位置
known_hosts #<==只要客戶端連接過服務端,就會產生這個文件
[root@s1 ~]# cat ~/.ssh/known_hosts #<==查看服務端公鑰的內容
10.0.0.61 ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAyNNGcTUQeoCPw+Inhd6M3KicWQuftqNfjtMOxWJBPvvP8s4zmiqLbfa5ZGLOtaVSgPBPN5Lslzy1jYlyXJAM9dHhd+yCwJ33ZaFw+y8K7uaipBMdRwcJ5N92rkV2DZagCAytqptvfnyj/aUFmVeAF6g99XrLgWuZUQ2Nk51b8NSgkbtRGSlR4e0z2RBSP1RE2vza5ZfW06dyRbZy4VDSc6aA5IpReECVlqAmIqcNdXD+ak73FXdHLzcBf6DYPXiHFUWs23YCaLPI6q6qFQyu7kLU6qXB3H5LzNfNJRj6qJgHeqUt4b15GGDag4B5jZYV87bvjWprgWwPIseNRtuBFQ=
1.2.2客戶端第2次連接服務端
[root@s1 ~]# ssh 10.0.0.61 #<==再次遠程登錄服務端
root@10.0.0.61's password:xxxxxx #<==直接提示輸入服務端的密碼
#<==因為已經有服務端的公鑰了
Last login: Wed Jul 27 00:20:45 2016 from 10.0.0.1
1.2.3SSH2.X的聯機過程
SSH2.x多加了一個確認聯機正確性的Diffle-Hellman機制。
1.3 SSH服務認證類型
有兩種,分別是:
r 基於口令的安全驗證
r 基於密鑰的安全驗證
1.3.1基於口令的安全驗證
[root@s1 ~]# ssh 10.0.0.61 #<==遠程連接到服務器上
root@10.0.0.61's password: #<==輸入服務端的密碼
Last login: Wed Jul 27 00:31:34 2016 from 10.0.0.1
[root@m01 ~]# logout #<==注銷
Connection to 10.0.0.61 closed.
[root@s1 ~]#
1.3.2基於密鑰的安全驗證
需要依靠密鑰,必須事先建立一對密鑰對,然后把公鑰放在需要訪問的目標服務器上,把私鑰放到SSH客戶端上。
簡單記憶,公鑰(id_dsa.pub)是鎖,私鑰(id_dsa)是鑰匙,只有鑰匙才能開鎖。
1.4 更改SSH默認登錄配置
更改前,先備份,只需要更改5個地方。
[root@m01 ~]# \cp /etc/ssh/sshd_config{,.ori} #<==更改前,先備份
[root@m01 ~]# vim /etc/ssh/sshd_config #<==修改配置文件
13 Port 52113 #<==對外監聽的端口
15 ListenAddress172.16.1.61:52113 #<==只在本機的內網口偵聽ssh服務,端口52113
42 PermitRootLoginno #<==不允許root用戶登錄
65 PermitEmptyPasswords no #<==不允許空密碼登錄
80 GSSAPIAuthentication no #<==解決連接慢的問題
122 UseDNS no #<==不使用DNS做反向解析
[root@m01 ~]# /etc/init.d/sshd reload #<==平滑重啟
重新載入 sshd: [確定]
1.4.1一鍵修改SSH的配置文件
\cp /etc/ssh/sshd_config{,.ori}
sed -ir '13 iPort 52113\nPermitRootLoginno\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd reload
1.4.2氂牛陣法
所有的服務器都不能被ssh連接管理,只有管理服務器能從內網卡連接到所有的服務器來管理。外網可以通過vpn撥號來管理,外網口全部不允許被連接管理,這樣做是為了安全。
1.4.3驗證
[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61 #<==指定端口,指定用戶名
oldboy@172.16.1.61's password: xxxxxx #<==輸入oldboy的密碼
[oldboy@m01 ~]$ hostname #<==連接成功
m01
[oldboy@m01 ~]$ whoami #<==查看用戶
oldboy
[oldboy@m01 ~]$ sudo su - #<==通過sudo切換到root用戶來管理
[root@m01 ~]# whoami
root
注意:windows 客戶端利用Secure CRT連接時,用戶名和端口也要修改!
r 用戶名:oldboy
r 端口:52113
1.4.4如何防止SSH登錄入侵小結
(1) 用密鑰登錄,不用密碼登陸
(2) 氂牛陣法:解決SSH安全問題
r 防火牆封閉SSH,指定源IP限制
r 開啟SSH只監聽本地內網IP(ListenAddress 172.16.1.61:52113)
(3) 盡量不給服務器外網IP
1.5 SSH命令詳解
1.5.1SSH命令用法
ssh -p52113 oldboy@172.16.1.61 [ 命令 ]
ssh:固定命令
-p:指定端口
oldboy:服務端的用戶名,以什么身份連接服務端
@:分隔符
172.16.1.61:服務端的內網IP
[ 命令 ]:連接到遠程服務器,執行命令;但不登錄到遠程服務器
1.5.1.1 直接連接遠程服務器
[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61
oldboy@172.16.1.61's password:
Last login: Wed Jul 27 13:31:13 2016 from 10.0.0.1
[oldboy@m01 ~]$ exit
1.5.1.2 連接遠程服務器執行命令
[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61/sbin/ifconfig eth0
oldboy@172.16.1.61's password:
eth0 Link encap:Ethernet HWaddr00:0C:29:FD:28:FD
inet addr:10.0.0.61 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fefd:28fd/64 Scope:Link
UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RXpackets:3574 errors:0 dropped:0 overruns:0 frame:0
TXpackets:2443 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RXbytes:329346 (321.6 KiB) TX bytes:443310(432.9 KiB)
1.5.2scp命令
scp - secure copy (remote file copy program)
每次都是全量拷貝,增量拷貝用rsync。
可以推(push,本地文件在前)和拉(pull,遠端文件在前)。
1.5.2.1 參數
-P:指定端口
-r:遞歸復制目錄
-p:復制目錄時,保持屬性
-l:限速Kbit/s
1.5.2.2 Push(推)
~客戶端將hosts文件復制到服務端
[root@s1 ~]# scp -P52113 /etc/hostsoldboy@172.16.1.61:/tmp
oldboy@172.16.1.61's password:
hosts
[root@m01 ~]# ls /tmp/ #<==服務端驗證
hosts
~客戶端將/etc目錄復制到服務端的/tmp下
[root@s1 ~]# scp -P52113 -rp /etcoldboy@172.16.1.61:/tmp
[root@m01 ~]# ll -d /tmp/etc/ #<==服務端驗證
drwxr-xr-x 90 oldboy oldboy 4096 2016-07-26 20:32/tmp/etc/
1.5.2.3 Pull(拉)
~客戶端將服務端的/tmp/etc目錄復制到客戶端的/data下
[root@s1 ~]# scp -P52113 -rpoldboy@172.16.1.61:/tmp/etc /data
[root@s1 ~]# ll -d /data/etc/
drwxr-xr-x 90 root root 4096 2016-07-26 20:32/data/etc/
1.5.2.4 scp知識小結
(1) scp是加密的遠程copy,而cp僅為本地copy。
(2) 可以把數據從一台機器推送到另一台機器,也可以從其它服務把數據拉回到本地執行命令的服務器。
(3) 每次都是全量完整copy,因此,效率不高,適合第一次copy用,如果需要增量copy,用rsync。
1.5.3sftp命令(幾乎不用!)
這個工具比較危險!不支持上傳目錄。
windows客戶端和linux服務器之間傳輸數據工具:
(1) rz、sz(lrzsz)
(2) winscp WinSCP-v4.0.5
(3) SFX(xshell)
(4) SFTP #<==基於ssh加密傳輸
(5) samba、http、ftp、nfs
[root@s1 ~]# sftp -oPort=52113 oldboy@172.16.1.61 #<==s1是客戶端
Connecting to 172.16.1.61...
oldboy@172.16.1.61's password:
sftp> pwd #<==查看當前目錄,是當前連接用戶的家目錄
Remote working directory: /home/oldboy
sftp> put /etc/hosts #<==上傳文件
Uploading /etc/hosts to /home/oldboy/hosts /etc/hosts 100% 330 0.3KB/s 00:00
sftp> put /etc/hosts /tmp #<==上傳文件到指定目錄下
Uploading /etc/hosts to /tmp/hosts /etc/hosts 100% 330 0.3KB/s 00:00
sftp> cd /tmp #<==也可以切換路徑
sftp> pwd
Remote working directory: /tmp
sftp> ls #<==也可以查看當前目錄的內容
etc hosts
sftp> get hosts #<==下載文件
sftp> get hosts /home #<==下載文件到指定目錄下
1.6 報錯集
1.6.1Connection refused
(1) 有可能是防火牆阻擋
(2) 有可能端口改變了
(3) 有可能對端服務沒開
[root@s1 ~]# ssh -p22 oldboy@172.16.1.61/sbin/ifconfig eth0
ssh: connect to host 172.16.1.61 port 22: Connection refused
1.6.2no route to host
可能是防火牆影響了
1.7 章節重點小結
(1) ssh為加密的遠程連接協議,相關軟件有:openssh、openssl
(2) 默認端口是22
(3) 版本有1.x和2.x
(4) 服務端遠程連接服務:sftp服務、sshd守護進程
(5) 客戶端:ssh、scp、sftp命令
(6) 安全驗證方式:口令和密鑰
(7) 服務安全優化:修改默認端口22,禁止root遠程連接和dns反向解析,ssh聽監聽內網IP
(8) 密鑰對:公鑰(id_dsa.pub)在服務端(鎖頭),私鑰(id_dsa)在客戶端(鑰匙)
第2章 SSH批量管理分發項目實戰
基於口令的安全驗證:
如何實現批量管理:expect、pssh、sshpass。
基於密鑰的安全驗證:
需要依靠密鑰,必須事先建立一對密鑰對,然后把公鑰放在需要訪問的目標服務器上,把私鑰放到SSH客戶端上。
公鑰(id_dsa.pub)是鎖(服務端),私鑰(id_dsa)是鑰匙(客戶端),只有鑰匙才能開鎖。
2.1 實戰環境
2.2 拓撲圖
2.3 操作步驟
2.3.1所有機器創建用戶及密碼
所有的密鑰都是基於用戶的!用戶統一用oldgirl。
useradd oldgirl
echo 123456|passwd --stdin oldgirl
id oldgirl
su - oldgirl
2.3.2m01創建密鑰對
ssh-keygen -t dsa #<==手動生成,一路向北
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1
echo -e "\n"|ssh-keygen -t dsa -N""
#<==非交互式創建密鑰(兩種),推薦要第一種
~操作過程
[oldgirl@m01 ~]$ ssh-keygen -t dsa #<==-t指定dsa加密算法,一路回車
Generating public/private dsa key pair. #<==產生dsa密鑰對
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: #<==指紋
81:a2:0b:80:27:e3:f3:14:dc:bb:3e:c8:54:a5:e7:beoldgirl@m01
The key's randomart image is:
+--[ DSA 1024]----+
| |
|. . . o |
|= .o..+ . |
|o+ ..+.. . |
|.o....o S |
| .+o .. |
| +.... |
| o... |
| ..E. |
+-----------------+
[oldgirl@m01 ~]$ ll ~/.ssh/ #<==查看密鑰對
總用量 8
-rw------- 1 oldgirl oldgirl 668 2016-07-27 16:30id_dsa #<==私鑰(鑰匙)
-rw-r--r-- 1 oldgirl oldgirl 601 2016-07-27 16:30id_dsa.pub #<==公鑰(鎖)
2.3.3先優化sshd的配置文件
所有服務器都執行以下的命令。
\cp /etc/ssh/sshd_config{,.ori}
sed -ir '13 iPort 52113\nPermitRootLoginno\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no'/etc/ssh/sshd_config
/etc/init.d/sshd reload
2.3.4m01分發公鑰
ssh-copy-id -i ~/.ssh/id_dsa.puboldgirl@172.16.1.41
#<==默認端口
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 52113 oldgirl@172.16.1.31"
#<==更改過的端口
操作過程如下:
~默認22端口
[oldgirl@m01 ~]$ ssh-copy-id -i ~/.ssh/id_dsa.puboldgirl@172.16.1.41
[oldgirl@backup ~]$ ll ./.ssh/ #<==在172.16.1.41上驗證
總用量 4
-rw------- 1 oldgirl oldgirl 601 2016-07-27 16:53 authorized_keys #<==公鑰名被改了
[root@backup .ssh]# grep authorized_keys/etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys #<==因為默認配置文件里有指定了
~更改過的端口:52113
[oldgirl@m01 ~]$ ssh-copy-id -i ~/.ssh/id_dsa.pub"-p 52113 oldgirl@172.16.1.31"
[oldgirl@nfs01 ~]$ ll .ssh/ #<==在172.16.1.31上驗證
總用量 4
-rw------- 1 oldgirl oldgirl 601 2016-07-27 17:05 authorized_keys #<==公鑰名被改了
[root@nfs01 ~]# grep authorized_keys/etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys #<==因為默認配置文件里有指定了
2.3.5測試
連接所有的機器,不提示密碼可以直接操作,這是成功的標志!
[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.8/sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.31/sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.41/sbin/ifconfig eth0
2.3.6批量管理腳本(執行命令)
[oldgirl@m01 ~]$ mkdir server/scripts -p
cd server/scripts/
cat >>view_ip.sh<<EOF
#!/bin/sh
ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0
ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfigeth0
ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfigeth0
EOF
sh view_ip.sh
2.3.7優化腳本※※※※※
[oldgirl@m01 scripts]$ cp view_ip.sh{,.ori}
[oldgirl@m01 scripts]$ cat view_ip.sh
#!/bin/sh
. /etc/init.d/functions#<==調用系統函數庫
if [ $# -ne 1 ];then#<==傳參的個數如果不等於1
echo"USAGE:/bin/sh $0 ARG"#<==打印幫助信息
exit#<==並退出,讓用戶再次輸入
fi
for n in 8 31 41
do
echo=========172.16.8.$n=========
ssh-p52113 oldgirl@172.16.1.$n "$1"#<==$1代表第1個參數
done
~驗證
[oldgirl@m01 scripts]$ sh view_ip.sh #<==必須要加一個參數,否則報錯
USAGE:/bin/sh view_ip.sh ARG
[oldgirl@m01 scripts]$ sh view_ip.sh "cat/etc/redhat-release"
#<==后面的參數,用雙引號引起來
=========172.16.8.8=========
CentOS release 6.7 (Final)
=========172.16.8.31=========
CentOS release 6.7 (Final)
=========172.16.8.41=========
CentOS release 6.7 (Final)
[oldgirl@m01 scripts]$ sh view_ip.sh"/sbin/ip a |grep eth1" #<==超級強大!
=========172.16.8.8=========
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet172.16.1.8/24 brd 172.16.1.255 scope global eth1
=========172.16.8.31=========
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet172.16.1.31/24 brd 172.16.1.255 scope global eth1
=========172.16.8.41=========
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet172.16.1.41/24 brd 172.16.1.255 scope global eth1
2.4 實現提權多種解決方案實踐
企業里實現ssh方案:3種。
2.4.1直接root用戶分發sshkey
條件:允許root用戶ssh登錄。
2.4.2利用suid實現沒有權限用戶拷貝(只做了解!)
一個命令如果設置了suid,那么任何用戶執行這個命令,就會有與這個命令屬主相同的權限。
[root@nfs01 ~]# chmod u+s `which rsync` #<==在nfs01上給命令授權
#<==在m01上實現推送
[oldgirl@m01 ~]$ scp -P52113 hostsoldgirl@172.16.1.31:~ #<==先把文件推送過去
[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.31rsync ~/hosts /etc/hosts
#<==再利用已授權的命令來強制執行覆蓋
2.4.3sudo提權實現沒有權限用戶拷貝※
所有的服務都配置sudoers文件:
#<==讓所有的服務器都允許oldgirl用戶使用rsync命令
echo "oldgirl ALL= NOPASSWD:/usr/bin/rsync" >>/etc/sudoers
visudo -c
[oldgirl@m01 ~]$ cp /etc/hosts . #<==先把hosts文件拷貝到oldgirl的家目錄
[oldgirl@m01 ~]$ scp -P52113 hostsoldgirl@172.16.1.8:~ #<==將本地文件推送到遠端
[oldgirl@m01 ~]$ rsync -avz hosts -e 'ssh -p52113' oldgirl@172.16.1.8:~
#<==增量推送,它是加密的
#<==遠程sudo,將遠端家目錄下的hosts文件直接覆蓋/etc目錄下的hosts文件
[oldgirl@m01 ~]$ ssh -p52113 -t oldgirl@172.16.1.8sudo rsync ~/hosts /etc/hosts
2.4.4批量分發文件腳本
[oldgirl@m01 ~]$ mkdir server/scripts -p
cd server/scripts/
cat >>fenfa.sh<<EOF
#!/bin/sh
scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo rsync~/hosts /etc/hosts
scp -P52113 hosts oldgirl@172.16.1.41:~
ssh -p52113 -t oldgirl@172.16.1.41 sudo rsync~/hosts /etc/hosts
scp -P52113 hosts oldgirl@172.16.1.8:~
ssh -p52113 -t oldgirl@172.16.1.8 sudo rsync~/hosts /etc/hosts
EOF
sh view_ip.sh
2.4.5優化腳本※※※※※
[oldgirl@m01 scripts]$ cp fenfa.sh fenfa1.sh
[oldgirl@m01 scripts]$ cat fenfa1.sh
#!/bin/sh
. /etc/init.d/functions
for n in 8 31 41
do
scp-P52113 ~/hosts oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\
ssh-p52113 -t oldgirl@172.16.1.$n sudo rsync ~/hosts /etc/hosts >/dev/null2>&1
if [ $?-eq 0 ];then
action"fenfa hosts 172.16.1.$n" /bin/true
else
action"fenfa hosts 172.16.1.$n" /bin/false
fi
done
~可以實現輸入要復制的文件,直接可以推送到遠程的服務器
[oldgirl@m01 scripts]$ cp fenfa1.sh fenfa2.sh
[oldgirl@m01 scripts]$ cat fenfa2.sh
#!/bin/sh
. /etc/init.d/functions#<==調用函數庫
if [ $# -ne 2 ];then#<==$#代表傳參的個數,ne代表如果不等於2個
echo"USAGE:/bin/sh $0 ARG1 ARG2"#<==打印幫助信息
exit#<==並退出,讓用戶再次輸入
fi
for n in 8 31 41
do
scp-P52113 ~/$1 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\#<==$1代表第1個參數
ssh-p52113 -t oldgirl@172.16.1.$n sudo rsync ~/$1 $2 >/dev/null 2>&1#<==$2代表第2個參數
if [ $?-eq 0 ];then#<==$?返回值是0,代表執行成功
action"fenfa hosts 172.16.1.$n" /bin/true
else
action"fenfa hosts 172.16.1.$n" /bin/false
fi
done
~驗證
[oldgirl@m01 scripts]$ cd ../..
[oldgirl@m01 ~]$ touch a.txt
[oldgirl@m01 ~]$ sh server/scripts/fenfa2.sh
2.5 自動化批量管理方案
(1) 最簡單常用ssh key,功能最強大,一般中小型企業會用,50—100台以下。
(2) sina cfengine/puppet較早的批量管理工具,現在基本沒有企業用。
(3) 門戶級別比較流行的,puppet批量管理工具,復雜,笨重。
(4) saltstack批量管理工具,特點:簡單,功能強大,趕集網,小米,一些CDN公司。
(5) http+cron
批量管理路線:sshkey cfengine puppet saltstack/ansible
2.6 expect非交互式功能
在m01上執行:
rpm -qa expect
yum install expect -y
#<==安裝expect軟件包后,會附帶安裝上mkpasswd命令,該命令可以生成隨機字符串
[root@m01 ~]# mkpasswd -l 20 #<==生成隨機字符串,-l參數指定生成字符串的長度
zo1bviqOf(xoj4uduxKc
2.6.1非交互密鑰分發
2.6.2添加用戶(所有機器)
useradd oldgirl888
echo 123456|passwd --stdin oldgirl888
id oldgirl888
2.6.3m01創建密鑰對
su - oldgirl888
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1
2.6.4m01分發公鑰expect腳本
[oldgirl888@m01 ~]$vim fenfa_sshkey.exp
#!/usr/bin/expect
if { $argc !=2 } {
send_user"usage:expect fenfa-expect.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts
#spawn scp -P52113 $file oldboy@$host:$dir
spawn ssh-copy-id -i $file "-p52113oldgirl888@$host"
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
exit -onexit {
send_user"Oldboy say good bye to you!\n"
}
#scripts uasge
#expect oldboy-6.exp file host dir
#expamle
#expect fenfa_sshkey.exp file host
#./fenfa_sshkey.exp ~/hosts 172.16.1.41:~/hosts
~驗證
[oldgirl888@m01 ~]$ expect fenfa_sshkey.exp.ssh/id_dsa.pub 172.16.1.31#<==管理機
[oldgirl888@nfs01 ~]$ ls .ssh/ #<==服務端,可以看到公鑰被推送過來了
authorized_keys
[oldgirl888@m01 ~]$ ssh -p52113 oldgirl888@172.16.1.31/sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr00:0C:29:21:26:C7
inet addr:10.0.0.31 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe21:26c7/64 Scope:Link
UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17426 errors:0 dropped:0overruns:0 frame:0
TXpackets:10238 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RXbytes:4460294 (4.2 MiB) TX bytes:1158786(1.1 MiB
2.6.5m01分發公鑰腳本
循環expect腳本,達到非交互式的功能;
循環腳本如下:(fenfa_sshkey.sh)
[oldgirl888@m01 ~]$ cat fenfa_sshkey.sh
#!/bin/sh
. /etc/init.d/functions
for ip in 8 31 41
do
expectfenfa_sshkey.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1
if [ $?-eq 0 ];then
action"$ip" /bin/true
else
action"$ip" /bin/false
fi
done
第3章 一鍵給多台服務器安裝vsftpd服務
幾乎所有的操作,全部在管理機上面操作。
3.1 創建用戶(所有機器)
useradd oldboy888
echo 123456|passwd --stdin oldboy888
id oldboy888
3.2 配置sudoers(所有機器)
echo "oldboy888 ALL= NOPASSWD: ALL">>/etc/sudoers
visudo -c
su - oldboy888
3.3 腳本(m01)
3.3.1腳本路徑
[root@m01 ~]# tree /home/oldboy888/
/home/oldboy888/
├── auto_deploy.sh #<==一鍵安裝軟件的腳本(最后執行這個腳本)
├── fenfa_sshkey.exp #<==一鍵分發公鑰的腳本
└── scripts
└── install.sh #<==安裝vsftpd軟件的腳本
1 directory, 3 files
3.3.2安裝軟件
[oldboy888@m01 ~]$ mkdir scripts
[oldboy888@m01 ~]$ vim scripts/install.sh
[oldboy888@m01 ~]$ cat scripts/install.sh
yum install vsftpd -y
3.3.3分發公鑰
[oldboy888@m01 ~]$ cat fenfa_sshkey.exp
#!/usr/bin/expect
if { $argc !=2 } {
send_user"usage:expect fenfa-expect.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts
#spawn scp -P52113 $file oldboy@$host:$dir
spawn ssh-copy-id -i $file "-p52113oldboy888@$host"
expect {
"yes/no" {send"yes\r";exp_continue}
"*password" {send"$password\r"}
}
expect eof
exit -onexit {
send_user"Oldboy say good bye to you!\n"
}
#scripts uasge
#expect oldboy-6.exp file host dir
#expamle
#expect fenfa_sshkey.exp file host
#./fenfa_sshkey.exp ~/hosts 172.16.1.41:~/hosts
3.3.4一鍵安裝軟件
[oldboy888@m01 ~]$ cat auto_deploy.sh
#!/bin/sh
. /etc/init.d/functions
##1.Product key pair
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1
if [ $? -eq0 ];then
action"create dsa $ip" /bin/true
else
action"create dsa $ip" /bin/false
exit 1
fi
##2.Distribute pub key
for ip in 8 31 41
do
expectfenfa_sshkey.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1
if [ $?-eq 0 ];then
action"$ip" /bin/true
else
action"$ip" /bin/false
fi
done
##3.Distribute fenfa scripts
for n in 8 31 41
do
scp -P52113 -rp ~/scripts oldboy888@172.16.1.$n:~
done
##4.Install service soft
for m in 8 31 41
do
ssh -t -p52113 oldboy888@172.16.1.$m sudo /bin/bash ~/scripts/install.sh
done
3.4 一鍵完美安裝
見證奇跡的時刻!
[oldboy888@m01 ~]$ sh -x auto_deploy.sh #<==參數-x可以看到執行腳本的過程
省略……
已安裝:
vsftpd.x86_64 0:2.2.2-21.el6
完畢!
Connection to 172.16.1.41closed.
3.5 打包備份
[root@m01 ~]# cd /home/
[root@m01 home]# tar zcvfauto_install_vsftpd_scripts.tar.gz ./oldboy888
[root@m01 home]# szauto_install_vsftpd_scripts.tar.gz -y
備份包存放路徑:
I:\00-老男孩培訓-軟件\01-備份包
3.6 vim批量替換的方法
需求:把oldboy888替換為gongli
:%s@oldboy888@gongli@g