$ 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.
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
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!