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

王林
Libérer: 2023-05-11 17:55:19
avant
1800 Les gens l'ont consulté
1. Utilisez la commande shell
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"
Copier après la connexion

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) 
# 数据清理
Copier après la connexion

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
Copier après la connexion
  • 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()
Copier après la connexion
  • 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()
Copier après la connexion
  • 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()
Copier après la connexion
  • 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()
Copier après la connexion
  • 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()
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal