Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Bagaimana untuk melaksanakan log masuk jauh linux dan sftp melalui Python

Bagaimana untuk melaksanakan log masuk jauh linux dan sftp melalui Python

王林
王林ke hadapan
2023-05-11 17:55:191751semak imbas
1. Gunakan arahan shell
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"

dan anda akan mendapati bahawa output anda mengandungi banyak maklumat yang anda tidak perlukan tetapi tidak boleh disingkirkan.
Untuk arahan shell, anda boleh terus menggunakan paip, atau ubah hala output standard ke fail untuk mendapatkan hasil pelaksanaan.

2. Gunakan subproses

Melalui Python, anda boleh memikirkan untuk menggunakan beberapa perpustakaan pelaksanaan perintah seperti os.popen, os.system, arahan, subproses, dll. untuk mendapatkan maklumat sistem secara tidak langsung. Output yang diperolehi oleh perpustakaan ini bukan sahaja mengandungi output standard tetapi juga maklumat ralat standard. Oleh itu, output mesti dibersihkan dan diformat setiap kali untuk mendapatkan data yang kita inginkan.

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

Ringkasnya, terdapat beberapa masalah menggunakan arahan ssh secara tidak langsung:

  • Pemasangan sshpass tambahan diperlukan (jika kata laluan tidak diperlukan)

  • Terdapat terlalu banyak maklumat gangguan, dan pembersihan dan pemformatan data agak menyusahkan

  • Pelaksanaan kod tidak cukup elegan dan kebolehbacaan terlalu lemah

  • sambungan ssh Ia tidak boleh digunakan semula Perintah hanya boleh dilaksanakan sekali bagi setiap sambungan

  • Kod tidak boleh digunakan pada semua platform dan hanya boleh digunakan. digunakan pada Linux dan OSX

3 Gunakan Paramiko
  • Pasang

python3 -m pip install
  • Kaedah 1: Log masuk melalui sshclient berdasarkan nama pengguna dan kata laluan
    Kaedah ini Tidak dapat menggunakan semula sambungan 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()
  • Kaedah 2: Log masuk melalui pengangkutan berdasarkan nama pengguna dan kata laluan
    Kaedah ini boleh menggunakan semula sambungan.

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()
  • Kaedah 3: Log masuk SSHClient berdasarkan kunci awam
    Kaedah ini tidak boleh menggunakan semula sambungan 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()
  • Kaedah 4: Log masuk mod pengangkutan berdasarkan kunci awam
    Kaedah ini boleh menggunakan semula sambungan.

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()
  • pemindahan fail 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()

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan log masuk jauh linux dan sftp melalui Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam