通过跳板机连接服务器
方式二:
在远程服务器上生成新的交互式shell
Python + Paramiko 的SSH基本使用:
- 执行命令
#!/usr/bin/env python3
import os
import threading
import paramiko
from sshtunnel import SSHTunnelForwarder
# client.invoke_shell()
class connect_ssh:
def readData(self, shell) -> object:
while True:
# 接收到的服务器返回值
data = shell.recv(2048)
if not data:
print("quit now")
break
# 查看命令执行的情况
data = data.decode()
print(data, end='')
def connect(self, cmd):
jump_host_ip = "103.115.**.**" # 跳板机
jump_host_user = “username"
jump_host_key = os.getenv('HOME') + "/.ssh/id_rsa"
target_bind_address = ('10.169.**.**', 22)
print("connecting to the jump host")
with SSHTunnelForwarder(
ssh_address_or_host=(jump_host_ip, 22), # 跳板机
ssh_username=jump_host_user,
ssh_pkey=jump_host_key,
remote_bind_address=target_bind_address,
local_bind_address=('127.0.0.1', 1234) # 可以指定任意合理的ip,port
) as tunnel:
print(tunnel.local_bind_address)
local_bind_host = tunnel.local_bind_host # 绑定本地的host
local_bind_port = tunnel.local_bind_port # 绑定本地的port
print(local_bind_port, local_bind_host)
print("** connected to the jump host **")
print("\nconnecting to the Destination host")
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=local_bind_host, port=local_bind_port, username=jump_host_user,
key_filename=jump_host_key, banner_timeout=50000)
# 激活terminal
shell = client.invoke_shell()
print("** connected to the jump host **")
# 创建一个线程
thread = threading.Thread(target=self.readData, args=(shell,))
thread.start()
# 发送命令
shell.sendall(cmd)
shell.send("ifconfig\n")
shell.send("exit\n")
thread.join()
client.close()
tunnel.close()
if __name__ == '__main__':
server = connect_ssh()
server.connect(cmd="pwd\n")
print("done")