Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So implementieren Sie Linux-Remote-Login und SFTP über Python

So implementieren Sie Linux-Remote-Login und SFTP über Python

王林
王林nach vorne
2023-05-11 17:55:191751Durchsuche
1. Verwenden Sie den Shell-Befehl
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

Dann werden Sie feststellen, dass Ihre Ausgabe viele Informationen enthält, die Sie nicht benötigen, die aber nicht entfernt werden können.
Für Shell-Befehle können Sie Pipes direkt verwenden oder die Standardausgabe in eine Datei umleiten, um Ausführungsergebnisse zu erhalten.

2. Verwenden von Unterprozessen

Über Python können Sie sich die Verwendung einiger Befehlsausführungsbibliotheken wie os.popen, os.system, Befehle, Unterprozesse usw. vorstellen, um Systeminformationen indirekt abzurufen. Die von diesen Bibliotheken erhaltene Ausgabe enthält nicht nur die Standardausgabe, sondern auch Standardfehlerinformationen. Daher muss die Ausgabe jedes Mal bereinigt und formatiert werden, um die gewünschten Daten zu erhalten.

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) 
# 数据清理

Kurz gesagt, es gibt mehrere Probleme bei der indirekten Verwendung von SSH-Befehlen:

  • Erfordert eine zusätzliche Installation von sshpass (wenn kein Passwort erforderlich ist)

  • Es gibt zu viele störende Informationen und die Datenbereinigung und -formatierung ist recht aufwändig problematisch

  • Code-Implementierung Nicht elegant genug, die Lesbarkeit ist zu schlecht

  • SSH-Verbindung kann nicht wiederverwendet werden, eine Verbindung kann nur einen Befehl ausführen

  • Der Code kann nicht auf allen Plattformen verwendet werden, sondern nur unter Linux und OSX

3. Verwenden Sie Paramiko
  • Installation

python3 -m pip install
  • Melden Sie sich über sshclient basierend auf Benutzername und Passwort an
    Diese Methode kann die SSH-Verbindung nicht wiederverwenden.

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()
  • Methode 2: Melden Sie sich per Transport basierend auf Benutzername und Passwort an
    Diese Methode kann die Verbindung wiederverwenden.

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()
  • Methode 3: SSH-Client-Anmeldung basierend auf öffentlichem Schlüssel
    Diese Methode kann die SSH-Verbindung nicht wiederverwenden.

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()
  • Methode 4: Anmeldung per Transportmethode basierend auf öffentlichem Schlüssel
    Diese Methode kann die Verbindung wiederverwenden.

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-Dateiübertragung

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()

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Linux-Remote-Login und SFTP über Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen