$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"
然後你會發現,你的輸出有很多你並不需要,但是又不會去不掉的一些資訊。
對於shell 指令,可以直接使用管道,或是將標準輸出重新導向到檔案的方法來取得執行結果。
透過Python可以想到使用 os.popen,os.system,commands,subprocess 等一些指令執行函式庫來間接取得系統資訊 。這些函式庫獲取的 output 不僅有標準輸出,還包含標準錯誤訊息。所以每次都要對 output 進行資料清理,然後整理格式化,才能得到我們想要的資料。
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) # 数据清理
總之,間接使用ssh指令的幾個問題:
#需要額外安裝sshpass(如果不免的話)
幹擾資訊太多,資料清理、格式化相當麻煩
程式碼實作不夠優雅,可讀性太差
ssh 連接不能重複使用,一次連線只能執行一次指令
#程式碼無法全平台,僅能在Linux 和OSX 上使用
安裝
python3 -m pip install
方法1:基於使用者名稱和密碼的sshclient 方式登入
該方法無法復用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()
方法2:基於使用者名稱和密碼的 transport 方式登入
該方法可以重複使用連線。
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()
方法3:基於公鑰的 SSHClient 方式登入
該方法無法重複使用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()
方法4:基於公鑰的 Transport 方式登入
此方法可以重複連接。
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()
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()
以上是怎麼透過Python實現linux遠端登陸及sftp的詳細內容。更多資訊請關注PHP中文網其他相關文章!