首頁  >  文章  >  運維  >  怎麼透過Python實現linux遠端登陸及sftp

怎麼透過Python實現linux遠端登陸及sftp

王林
王林轉載
2023-05-11 17:55:191751瀏覽
1. 使用shell指令
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

然後你會發現,你的輸出有很多你並不需要,但是又不會去不掉的一些資訊。
對於shell 指令,可以直接使用管道,或是將標準輸出重新導向到檔案的方法來取得執行結果。

2. 使用 subprocess

透過Python可以想到使用 os.popen,os.system,commands,subprocess 等一些指令執行函式庫來間接取得系統資訊 。這些函式庫獲取的 output 不僅有標準輸出,還包含標準錯誤訊息。所以每次都要對 output 進行資料清理,然後整理格式化,才能得到我們想要的資料。

import subprocess 
ssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx  'ls -l'" 
status, output = subprocess.getstatusoutput(ssh_cmd) 
# 数据清理

總之,間接使用ssh指令的幾個問題:

  • #需要額外安裝sshpass(如果不免的話)

  • 幹擾資訊太多,資料清理、格式化相當麻煩

  • 程式碼實作不夠優雅,可讀性太差

  • ssh 連接不能重複使用,一次連線只能執行一次指令

  • #程式碼無法全平台,僅能在Linux 和OSX 上使用

3.使用Paramiko
  • 安裝

python3 -m pip install
  • 方法1:基於使用者名稱和密碼的sshclient 方式登入
    該方法無法復用ssh連線。

import paramiko 
 
ssh = paramiko.SSHClient() 
# 允许连接不在know_hosts文件中的主机 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
 
# 建立连接 
ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") 
 
# 使用这个连接执行命令 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
 
# 获取输出 
print(ssh_stdout.read()) 
 
# 关闭连接 
ssh.close()
  • 方法2:基於使用者名稱和密碼的 transport 方式登入
    該方法可以重複使用連線。

import paramiko 
 
# 建立连接 
trans = paramiko.Transport(("xx.xx.xx.xx", 22)) 
trans.connect(username="root", password="you_passwd") 

ssh = paramiko.SSHClient() 
ssh._transport = trans 
 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
print(ssh_stdout.read()) 
 
# 关闭连接 
trans.close()
  • 方法3:基於公鑰的 SSHClient 方式登入
    該方法無法重複使用ssh連線。

import paramiko 
 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
 
# 建立连接 
ssh = paramiko.SSHClient() 
ssh.connect(hostname='xx.xx.xx.xx', 
            port=22, 
            username='you_username', 
            pkey=pkey) 
 
# 执行命令 
stdin, stdout, stderr = ssh.exec_command('ls -l') 
 
# 结果放到stdout中,如果有错误将放到stderr中 
print(stdout.read()) 
 
# 关闭连接 
ssh.close()
  • 方法4:基於公鑰的 Transport 方式登入
    此方法可以重複連接。

import paramiko 
 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。 
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
 
# 建立连接 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
trans.connect(username='you_username', pkey=pkey) 

ssh = paramiko.SSHClient() 
ssh._transport = trans 
 
# 执行命令,和传统方法一样 
stdin, stdout, stderr = ssh.exec_command('df -hl') 
print(stdout.read().decode()) 
 
# 关闭连接 
trans.close()
  • sftp 檔案傳輸

#
import paramiko 
 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
 
# 建立连接 
trans.connect(username='you_username', password='you_passwd') 
 
# 实例化一个 sftp对象,指定连接的通道 
sftp = paramiko.SFTPClient.from_transport(trans) 
 
# 发送文件 
sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') 
 
# 下载文件 
sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') 
trans.close()

以上是怎麼透過Python實現linux遠端登陸及sftp的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除