在使用Django框架結合Paramiko進行SSH遠程操作時,通常涉及到自動化腳本的執行,比如遠程服務器上的命令執行、文件傳輸等。如果你的需求是“跳轉登錄”,即在登錄遠程服務器后,再通過該服務器的SSH連接跳轉到另一臺服務器(例如,通過SSH代理或端口轉發),你可以通過以下幾種方式實現:
- 使用SSH端口轉發(Port Forwarding)
這是最常用的方法之一,可以在第一次連接時設置端口轉發,使得后續的連接可以通過這個轉發的端口直接訪問目標服務器。
import paramiko# 創建SSH對象
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接到第一臺服務器
ssh.connect('server1.example.com', username='user1', password='password1')# 設置端口轉發
local_port = 2222 # 本地端口
remote_host = 'server2.example.com' # 目標服務器地址
remote_port = 22 # 目標服務器SSH端口,通常是22
ssh.get_transport().set_keepalive(300) # 設置保持活動,防止連接超時
ssh.get_transport().request_port_forward('', local_port, (remote_host, remote_port))# 現在你可以通過localhost:local_port連接到server2
ssh2 = paramiko.SSHClient()
ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh2.connect('localhost', local_port, username='user2', password='password2')
- 使用SSH代理(ProxyCommand)
在某些情況下,如果你使用的是支持ProxyCommand的SSH客戶端,你可以在.ssh/config文件中設置代理:
Host server1HostName server1.example.comUser user1IdentityFile /path/to/private/keyHost server2-via-server1HostName server2.example.comUser user2ProxyCommand ssh -W %h:%p user1@server1.example.com
然后在Python中使用:
import paramikossh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('server2-via-server1', username='user2', password='password2')
- 使用SSH的Agent Forwarding(適用于密鑰認證)
如果你希望使用SSH密鑰進行認證,可以使用agent forwarding:
import paramikossh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('server1.example.com', username='user1') # 直接使用本地SSH agent進行認證# 啟用agent forwarding到server2
transport = ssh.get_transport()
channel = transport.open_channel("direct-tcpip", ("server2.example.com", 22), ("localhost", 0))
channel.set_name("agent-forwarding") # 設置一個名稱以便于管理多個通道
channel.get_pty() # 獲取一個偽終端(可選)
channel.invoke_shell() # 啟動shell會話
print(channel.recv(1000).decode()) # 顯示歡迎信息等(可選)
- 使用第三方庫如fabric或invoke簡化操作
如果你覺得Paramiko過于底層,可以使用fabric或invoke等更高級的庫來簡化SSH操作:
from fabric import Connection, Config, OperationTimeoutExceededError, task,