環境:
ssh server: 192.168.100.29 server.example.com
ssh client: 192.168.100.30 client.example.com
通過root使用者建立秘鑰認證實現SHELL指令碼管理,分發,部署
首先client端建立秘鑰對,並將公開金鑰分發給需要登入的SSH服務端
註:公開金鑰相當於鎖,私密金鑰相當於鑰匙,我們這裡相當於在用戶端建立一對鑰匙和鎖,想要做到SSH免密碼登入,就相當於我們將鎖分發到服務端並裝鎖,然後用戶端就可以利用鑰匙開鎖。
一.建立秘鑰認證
1.在用戶端建立秘鑰對:(ssh client)
複製代碼 代碼如下:
# su - root
# ssh-keygen -t dsa
一路斷行符號即可
複製代碼 代碼如下:
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
e9:5e:4a:7f:79:64:c5:ae:f2:06:a7:26:e4:41:5c:0e root@zabbix.example.com
The key's randomart image is:
+--[ DSA 1024]----+
| |
| E . |
| . + . |
| .o . o|
| S. o |
| . o . + .|
| oo.. B . |
| o +o * + |
| o .+ =. |
+-----------------+
2.查看產生的秘鑰對:(ssh client)
複製代碼 代碼如下:
# ls -lda .ssh
-----------------
drwx------ 2 root root 4096 6月 6 23:03 .ssh
-----------------
# cd .ssh
# ls -la
------------------
總用量 16
drwx------ 2 root root 4096 6月 6 23:03 .
dr-xr-x---. 26 root root 4096 6月 6 23:03 ..
-rw------- 1 root root 668 6月 6 23:03 id_dsa
-rw-r--r-- 1 root root 613 6月 6 23:03 id_dsa.pub
------------------
秘鑰產生完畢
3.將公開金鑰(鎖)分發到SSH服務端:(ssh client)
複製代碼 代碼如下:
# ssh-copy-id -i .ssh/id_dsa.pub 192.168.100.29
註:若非root使用者,以及自訂SSH連接埠,則格式為:
複製代碼 代碼如下:
# ssh-copy-id -i .ssh/id_rsa.pub "-p 22 user@server"
輸入yes,然後密碼後斷行符號:
複製代碼 代碼如下:
The authenticity of host '192.168.100.30 (192.168.100.30)' can't be established.
RSA key fingerprint is fc:9b:2e:38:3b:04:18:67:16:8f:dd:94:a8:bd:08:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.30' (RSA) to the list of known hosts.
Address 192.168.100.30 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
root@192.168.100.30's password:
Now try logging into the machine, with "ssh '192.168.100.30'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
公開金鑰分發完畢
4.服務端查看收到的分發檔案:(ssh server)
複製代碼 代碼如下:
# ll /root/.ssh
-------------
總用量 4
-rw------- 1 root root 613 6月 6 23:29 authorized_keys
-------------
成功收到
5.用戶端驗證登陸:(ssh client)
查看服務端IP地址:
複製代碼 代碼如下:
# ssh 192.168.100.29 /sbin/ifconfig eth0
-----------------------
Address 192.168.100.29 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
eth0 Link encap:Ethernet HWaddr 00:0C:29:7A:4F:30
inet addr:192.168.100.29 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7a:4f30/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:184297 errors:0 dropped:0 overruns:0 frame:0
TX packets:162028 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:163599380 (156.0 MiB) TX bytes:51284830 (48.9 MiB)
Interrupt:19 Base address:0x2000
註:這裡遇到警告提示“Address 192.168.100.29 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!”。
解決辦法為修改用戶端/etc/hosts檔案,將服務端的ip地址與主機名稱對應關係寫進去就可以了。
複製代碼 代碼如下:
(ssh client)
# echo "192.168.100.29 server.example.com" >> /etc/hosts
重新查看
複製代碼 代碼如下:
# ssh 192.168.100.29 /sbin/ifconfig eth0
無錯誤提示:
複製代碼 代碼如下:
--------------------------
eth0 Link encap:Ethernet HWaddr 00:0C:29:7A:4F:30
inet addr:192.168.100.29 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7a:4f30/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:184530 errors:0 dropped:0 overruns:0 frame:0
TX packets:162264 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:163618650 (156.0 MiB) TX bytes:51304877 (48.9 MiB)
Interrupt:19 Base address:0x2000
---------------------------
查看服務端記憶體
複製代碼 代碼如下:
# ssh 192.168.100.29 free -m
--------------------------
total used free shared buffers cached
Mem: 1006 991 14 0 177 308
-/+ buffers/cache: 506 500
Swap: 1023 6 1017
---------------------------
二.建立SHELL指令碼實現批量管理:(ssh client)
1.建立指令碼:
複製代碼 代碼如下:
# cd /etc/rc.d
# vi manager.sh
------------------
for ip in `cat iplist`
do
echo "---$ip---"
ssh $ip $1
done
------------------
2.產生IP列表:(若有多台SSH服務端需要管理,這裡以此類推即可)
複製代碼 代碼如下:
# echo 192.168.100.29 >> iplist
# echo 192.168.100.28 >> iplist
。。。。。
# cat iplist
---------------
192.168.100.29
---------------
3.執行指令碼:
複製代碼 代碼如下:
# sh manager.sh "df -h"
----------------
---192.168.100.29---
檔案系統 容量 已用 可用 已用%% 掛載點
/dev/sda3 19G 6.7G 11G 38% /
tmpfs 504M 0 504M 0% /dev/shm
/dev/sda1 194M 27M 158M 15% /boot
----------------
管理成功
三.建立SHELL指令碼實現批量分發:(ssh client)
1.建立指令碼:
複製代碼 代碼如下:
# cd /etc/rc.d
# vi distribute.sh
------------------
for ip in `cat iplist`
do
echo "---$ip---"
scp -r -p $1 $ip:$2
done
------------------
指令碼IP列表已建立
執行指令碼:
將本地/root下檔案分發到SSH服務端主機
複製代碼 代碼如下:
# sh distribute.sh /root /tmp
------------------
---192.168.100.29---
.ICEauthority 100% 620 0.6KB/s 00:00
install.log.syslog 100% 10KB 10.2KB/s 00:00
preferred-web-browser.desktop 100% 2378 2.3KB/s 00:00
preferred-mail-reader.desktop 100% 257 0.3KB/s 00:00
.converted-launchers 100% 0 0.0KB/s 00:00
.bash_history 100% 3200 3.1KB/s 00:00
.bash_logout 100% 18 0.0KB/s 00:00
applet_dirlist 100% 0 0.0KB/s 00:00
saved_state 100% 65KB 64.5KB/s 00:00
8f329b0c645a51e018b765fa0000001a-0 100% 463 0.5KB/s 00:00
............
------------------
分發成功
四.批量部署:
這裡的部署就結合了SHELL指令碼批量管理和分發兩個功能。
比如你要部署N台SSH服務端大量安裝APACHE。
1.寫好APACHE安裝指令碼。
2.將安裝指令碼分發到SSH服務端。
3.利用SHELL管理遠端執行該指令碼即可。
這裡就不做過多示範,有機會我整理下我的LAMP文檔,寫個APACHE指令碼,在這裡示範下。
註:因為涉及風險操作。所以不推薦線上利用root使用者進行批量管理操作。
建議設定普通賬戶,再利用sudo提權操作。
通過普通使用者建立秘鑰認證並sudo提權進行管理,分發,部署
複製代碼 代碼如下:
(ssh server)
# useradd user02
# echo "123456" | passwd --stdin user02
(ssh client)
# useradd user01
# echo "123456" | passwd --stdin user01
# su - user01
# ssh-keygen -t dsa
註:預設三個斷行符號完成建立
複製代碼 代碼如下:
# ssh-copy-id -i .ssh/id_dsa.pub user02@192.168.100.29
輸入密碼123456,分發完畢
驗證:
複製代碼 代碼如下:
# ssh user02@192.168.100.29 /sbin/ifconfig eth0
返回192.168.100.29端IP即表明秘鑰驗證成功。
分發:
註:用戶端user01使用者現在可以免密碼分發到服務端user02所屬檔案夾,但若想分發到root所屬檔案夾,則需要sudo提權。
1.服務端sudo提權:
複製代碼 代碼如下:
# su - root
# echo "user02 ALL=(ALL) NOPASSWD:/usr/bin/rsync,/bin/tar,/usr/bin/scp,/bin/cp" >> /etc/sudoers
登入user02賬戶
複製代碼 代碼如下:
# su - user02
查看賬戶資訊:
複製代碼 代碼如下:
# sodo -l
----------------
............
User user02 may run the following commands on this host:
(ALL) NOPASSWD: /usr/bin/rsync, (ALL) /bin/tar, (ALL) /usr/bin/scp,(ALL) /bin/cp
----------------
2.用戶端先分發到服務端user02使用者家目錄:
複製代碼 代碼如下:
# scp -P22 -r -p /home/user01/ user02@192.168.100.29:/home/user02
-----------------------------
.bash_logout 100% 18 0.0KB/s 00:00
.bashrc 100% 124 0.1KB/s 00:00
known_hosts 100% 396 0.4KB/s 00:00
id_dsa 100% 672 0.7KB/s 00:00
id_dsa.pub 100% 615 0.6KB/s 00:00
.bash_profile 100% 176 0.2KB/s 00:00
-------------------------------
2.串連服務端後執行sudo cp命令執行本地拷貝:
複製代碼 代碼如下:
# ssh -t user02@192.168.100.29 sudo cp /home/user02 /etc
-----------------------
Connection to 192.168.100.29 closed.
-----------------------
拷貝成功
註:
複製代碼 代碼如下:
# cp /test1 /test2/
是將/test1目錄拷貝到/test2/目錄下
複製代碼 代碼如下:
# cp /test1/ /test2/
是將/test1目錄下的所有檔案拷貝到/test2/目錄下
-------大功告成--------