Maison >Opération et maintenance >exploitation et maintenance Linux >Comment implémenter la connexion à distance Linux et sftp via Python
$ 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.
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
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!