1. 程式人生 > >老男孩14期自動化運維day9隨筆和作業(多執行緒批量管理主機)(一)

老男孩14期自動化運維day9隨筆和作業(多執行緒批量管理主機)(一)

1.paramiko 通過python實現模擬ssh批量登入
在linux系統上 ssh本身也可以用來傳檔案,例如:使用 scp -r /opt/test [email protected]_host:/opt 命令也可以執行傳輸檔案到遠端主機。
(小知識點:Linux中 l.可以檢視隱藏檔案,ls -a 檢視所有檔案(包含隱藏檔案),金鑰存放的位置id_rsa、id_rsa.pub和know_host的位置都在/root/.ssh目錄下 .ssh表示隱藏目錄)

以下是一個paramiko模擬ssh登入的寫法:
步驟:(1)ssh=paramiko.SSHClient()
(2)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
(3)ssh.connect(hostname=…,port=…,username=…,password=…)

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


# 基於使用者名稱密碼登入 不安全
import paramiko
# 建立ssh物件
ssh = paramiko.SSHClient()
# 允許連線不在know_hosts 檔案中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 連線伺服器
ssh.connect(hostname='172.16.95.132',port=22,username='root',password='960314')

# 執行命令
stdin,stdout,stderr= ssh.exec_command('ls') res,err=stdout.read(),stderr.read() result = res if res else err # 獲取命令結果 # result =stdout.read() print(result.decode()) # 關閉連線 ssh.close()

注意:
(1)ssh.set_missing_host_key_policy(paramiko.AutoPolicy)是使用忽略know_host檔案中主機的連線策略。當遠端主機的know_host檔案中缺少當前主機的host_key則不允許連線。使用上述策略後可以連線。
(2)stdin,stdout,stderr=ssh.exec.command(‘ls’)是將執行結果返回給三個值,把三目運算子 res if res else err 賦給result的目的是當輸出為結果時返回,當輸出為錯誤資訊時也作為結果返回

2.paramiko 通過模擬sftp實現檔案傳輸
要先例項化一個連線transport,引數是ip和埠,然後呼叫transport的connect方法引數為username和pwd來建立連線,最後將transport作為引數來例項化sftp才能進行傳輸。
步驟:(1)transport=paramiko.Transport((ip,port)) 注意引數為元組
(2)transport.connect(username=…,password=…)
(3)sftp=paramiko.SFTPClient.from_transport(transport)
以下為一個實現的例子:

#!/usr/bin/env python
# coding:utf-8
# Author:Yang

import paramiko

transport = paramiko.Transport(('172.16.95.132',22)) # transport 例項
transport.connect(username='root',password='960314') # 建立連線

sftp=paramiko.SFTPClient.from_transport(transport)
sftp.put('note.txt','/root/1.txt') # 上傳
# sftp.get('/root/1.txt','note2.txt') # 下載

transport.close()

3.ssh 金鑰
在程式碼中如果直接寫ip的密碼不夠安全,為了解決這種不安全的問題,可以通過生成金鑰的方式。
ssh 金鑰 使用 RSA(非對稱金鑰驗證)
(1)公鑰(public key) 本機生成 給別人
(2)私鑰(private key) 本機生成 放在本機
例如:
本機 目標機
10.0.0.31 ----->10.0.0.41
私鑰 公鑰(給別人) 這是單向登入 31可以無密碼登41 41無法登31 必須在41使用者目錄生成私鑰公鑰,把公鑰給31才能無密碼登入
私鑰和公鑰是10.0.0.31本機生成的 是一對的(一起生成的)
(3)金鑰生成
在linux上生成私鑰公鑰的命令為:ssh-keygen
/root/.ssh/id_rsa 私鑰
/root/.ssh/id_rsa.pub 公鑰將公鑰複製到目標機要登入對應使用者目錄的.ssh目錄下authorized_keys檔案裡 …
由於複製容易出現編碼問題,這裡有命令可以執行:ssh-copy-id “-p22 [email protected]_host”(在centos7中貌似不是這樣)

實踐後具體的步驟為:
1.本機ssh-keygen 生成金鑰對
2.ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 remote_host
3.輸入密碼即可將公鑰寫入遠端主機 ~/.ssh/authorized_key裡實現無密碼登入

注意:例如想要在windows上實現嘗試金鑰登入 在linux上執行sz /root/.ssh/id_rsa 把linux本機的私鑰拷貝到python資料夾裡,就能通過模擬該本機去金鑰連線其他主機

(小知識點,檔案的許可權)
421 421 421
rwx rwx rwx chmod 777
屬主 屬組 others

以下為python實現金鑰ssh登入:

#!/usr/bin/env python
# coding:utf-8
# Author:Yang


# 基於金鑰的登入
import paramiko



#  例如想要在windows上嘗試金鑰登入 在linux上執行 sz /root/.ssh/id_rsa 就能拷貝到windows本地 ,使用paramiko_rsa.py裡登入
# 172.16.95.132的私鑰
private_key=paramiko.RSAKey.from_private_key_file('id_rsa.txt')
# 建立ssh物件
ssh = paramiko.SSHClient()
# 允許連線不在know_hosts 檔案中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# 連線伺服器
ssh.connect(hostname='172.16.95.132',port=22,username='root',pkey=private_key)

# 執行命令
stdin,stdout,stderr= ssh.exec_command('ls')
res,err=stdout.read(),stderr.read()
result = res if res else err
# 獲取命令結果
# result =stdout.read()
print(result.decode())

# 關閉連線
ssh.close()