Maison  >  Article  >  Opération et maintenance  >  Comment implémenter la connexion à distance Linux et sftp via Python

Comment implémenter la connexion à distance Linux et sftp via Python

王林
王林avant
2023-05-11 17:55:191751parcourir
1. Utilisez la commande shell
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

Vous constaterez ensuite que votre sortie contient de nombreuses informations dont vous n'avez pas besoin, mais qui ne peuvent pas être supprimées.
Pour les commandes shell, vous pouvez utiliser des tuyaux directement ou rediriger la sortie standard vers un fichier pour obtenir les résultats d'exécution.

2. Utilisation du sous-processus

Grâce à Python, vous pouvez penser à utiliser certaines bibliothèques d'exécution de commandes telles que os.popen, os.system, commands, subprocess, etc. pour obtenir indirectement des informations système. La sortie obtenue par ces bibliothèques contient non seulement une sortie standard, mais contient également des informations sur les erreurs standard. Par conséquent, la sortie doit être nettoyée et formatée à chaque fois pour obtenir les données souhaitées.

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

En bref, l'utilisation indirecte des commandes ssh pose plusieurs problèmes :

  • Nécessite une installation supplémentaire de sshpass (si le mot de passe n'est pas requis)

  • Il y a trop d'informations interférentes, et le nettoyage et le formatage des données sont assez gênant

  • Implémentation du code Pas assez élégant, la lisibilité est trop mauvaise

  • la connexion ssh ne peut pas être réutilisée, une connexion ne peut exécuter qu'une seule commande

  • Le code ne peut pas être utilisé sur toutes les plateformes, il ne peut être utilisé que sous Linux et OSX

3. Utilisez Paramiko
  • Installation

python3 -m pip install
  • Méthode 1 : Connectez-vous via sshclient en fonction du nom d'utilisateur et du mot de passe
    Cette méthode ne peut pas réutiliser la connexion 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()
  • Méthode 2 : Connectez-vous via le transport en fonction du nom d'utilisateur et du mot de passe
    Cette méthode peut réutiliser la connexion.

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()
  • Méthode 3 : connexion SSHClient basée sur la clé publique
    Cette méthode ne peut pas réutiliser la connexion 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()
  • Méthode 4 : Connexion par méthode de transport basée sur la clé publique
    Cette méthode peut réutiliser la connexion.

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()
  • transfert de fichiers FTP

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer