目錄
- 簡介
- 安裝 Paramiko
- 連接到遠程服務器
- 執行遠程命令
- 文件傳輸
- 示例
簡介
Paramiko 是一個基于 Python 的 SSH 客戶端庫,它提供了在網絡上安全傳輸文件和執行遠程命令的功能。本教程將介紹 Paramiko 的基本用法,包括連接到遠程服務器、執行命令、文件傳輸等常見操作。
安裝 Paramiko
可以使用 pip 命令安裝 Paramiko:
pip install paramiko
連接到遠程服務器
創建一個 SSHClient 對象,使用 connect() 方法連接到遠程服務器:
# 創建 SSHClient 實例
ssh_client = paramiko.SSHClient()
# 允許連接不在 known_hosts 文件中的主機
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接到遠程服務器
ssh_client.connect(hostname, port, username, password)
執行遠程命令
使用 exec_command() 方法執行遠程命令,并獲取輸入、輸出和錯誤流:
# 執行遠程命令
stdin, stdout, stderr = ssh_client.exec_command(command)
# 向執行命令寫入信息(一般交互式命令會用到)
stdin.write(content)
# 讀取執行命令的輸出信息
output = stdout.read().decode()
# 讀取執行命令的報錯信息
error = stderr.read().decode()
文件傳輸
創建一個 SFTPClient 對象,使用 put() 和 get() 方法上傳和下載文件:
# 創建 SFTPClient 實例
sftp_client = ssh_client.open_sftp()
# 上傳文件
sftp_client.put(local_path, remote_path)
# 下載文件
sftp_client.get(remote_path, local_path)
示例
下面是一個完整示例,演示了 Paramiko 的基本用法,包括連接到遠程服務器、執行命令、文件傳輸等常見操作:
import paramiko
import timedef ssh_connect(hostname, port, username, password):# 創建 SSHClient 實例ssh_client = paramiko.SSHClient()# 允許連接不在 known_hosts 文件中的主機ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接到遠程服務器ssh_client.connect(hostname, port, username, password)return ssh_clientdef ssh_vim(ssh_client, path):# 執行 vim 命令,并獲取輸入、輸出和錯誤流stdin1, stdout1, stderr1 = ssh_client.exec_command(f'vim {path}')# 進入插入模式stdin1.write('i')# 插入文本stdin1.write('Hello World!')# esc 鍵,退出插入模式stdin1.write('\x1b')# 保持并退出stdin1.write(':wq\n')# 關閉執行命令的輸入流stdin1.close()# 等待 3 秒后,再查看文件內容,太快可能獲取不到最新的文件內容time.sleep(3)# 執行 cat 命令,并獲取輸入、輸出和錯誤流stdin2, stdout2, stderr2 = ssh_client.exec_command(f'cat {path}')# 讀取執行命令的輸出信息和錯誤信息,并輸出到控制臺print(stdout2.read().decode(), stderr2.read().decode())def sftp_put(ssh_client, local_path, remote_path):# 創建 SFTPClient 實例sftp_client = ssh_client.open_sftp()# 上傳文件sftp_client.put(local_path, remote_path)# 關閉 SFTP 連接sftp_client.close()def sftp_get(ssh_client, remote_path, local_path):# 創建 SFTPClient 實例sftp_client = ssh_client.open_sftp()# 下載文件sftp_client.get(remote_path, local_path)# 關閉 SFTP 連接sftp_client.close()if __name__ == '__main__':# 連接到遠程服務器ssh_client = ssh_connect(hostname, port, username, password)# 執行 vim 命令ssh_vim(ssh_client, path)# 上傳文件sftp_put(ssh_client, local_path, remote_path)# 下載文件sftp_get(ssh_client, remote_path, local_path)# 關閉 SSH 連接ssh_client.close()