python 的paramiko 模塊,改模塊是基於ssh用於連接遠程伺服器並執行相關操作 SSHClient 用於連接遠程伺服器並執行基本命令: 基於用戶名密碼的連接: 如果遇到這樣的問題 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy ...
python 的paramiko 模塊,改模塊是基於ssh用於連接遠程伺服器並執行相關操作
SSHClient
用於連接遠程伺服器並執行基本命令:
基於用戶名密碼的連接:
1 import paramiko 2 3 # 創建SSH對象 4 ssh = paramiko.SSHClient() 5 # 允許連接不在know_hosts文件中的主機 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 連接伺服器 8 ssh.connect(hostname='0.0.0.0', port=22, username='root', password='123456') 9 10 # 執行命令 11 stdin, stdout, stderr = ssh.exec_command('df') 12 # 獲取命令結果 13 #標準輸出只有在正確的情況下才會有輸出,錯誤的情況下沒有 14 res,err = stdout.read(),stderr.read() 15 result = res if res else err 16 print(result.decode()) 17 # 關閉連接 18 ssh.close()
如果遇到這樣的問題
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())這個函數就能夠能好的解決
解釋:
在linux中直接通過ssh去登錄遠程,會出現如下的問題:
輸入yes之後:
輸入密碼就可以登錄。
在linux中如果有一個文件 /root/.ssh/known_hosts
裡面就有一個10.0.0.41的相關rsa信息,如果這個文件里有這個安全的簽名認證,就可以直接輸入密碼連接,否則就需要自己做判斷是否加入known_hosts
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())就是解決了這個問題,自動添加認證
在這裡,不能執行“top”命令,只能讓他執行那種一次性執行完畢的命令
SFtpClient
ssh遠程傳文件命令:
#r即使是目錄也會傳,p是會把文件的許可權也傳過去
scp -rp -P52113 文件名 [email protected]:/tmp/
查看文件內容,目錄內容可以用:more ****
用於連接遠程伺服器並執行上傳和下載
基於用戶名密碼上傳下載
import paramiko transport = paramiko.Transport(('192.168.5.9', 22)) transport.connect(username='root', password='123456') sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至伺服器 /tmp/test.py sftp.put('筆記', '/tmp/test_from_win') # 將remove_path 下載到本地 local_path sftp.get('/root/test.txt', 'fromlinux.txt') transport.close()
put()方法是上傳文件,get()方法是下載文件
上面兩種方式都是用了明文用戶名密碼,這個是很不安全的。所以可以用密鑰去連接
ssh密鑰-----RSA非對稱密鑰驗證
公鑰(public key):是給別人的
私鑰(private key)
10.0.0.31 ----------》10.0.0.41 這樣就可以無密碼連接
私鑰 公鑰
在linux中:
a. linux中生成公鑰私鑰對:#ssh-keygen(預設保存在/root/.ssh/id_rsa)
私鑰在id_rsa中,公鑰在id_rsa.pub中
b.將本地的公鑰添加到遠程機器的authorized_keys中,從而實現SSH無密碼登錄。ssh-copy-id "-p22 [email protected]"
c.利用ssh遠程無密碼登錄:ssh [email protected] -p22
在windows中:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa9.txt') # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接伺服器 ssh.connect(hostname='192.168.5.12', port=22, username='xiaoming', pkey=private_key) # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() print(result.decode()) # 關閉連接 ssh.close()
使用rz/sz命令可以將linux生成的公鑰上傳到windows上:sz ~/.ssh/id_rsa
安裝rz/sz命令:yum install lrzsz
然後將得到的id_rsa放到項目當中就可以使用了