python - python连接到远程主机并在本地主机上捕获网页
问题描述
我在这里查看了多处理,在大多数情况下,我已经缩小了范围,但最后一点由于某种原因失败了。
语境
我有一个连接到的远程网络服务器,我已将 HTTP 页面转发到本地端口。我需要连接到远程主机,当我连接时,我需要在本地机器上打开 HTTP 页面并捕获该页面。
代码
from selenium import webdriver
from pyvirtualdisplay import Display
import paramiko
import multiprocessing
import time
def grabscreendisplay():
time.sleep(10)
print('running display code now... ')
display = Display(size=(1024, 768), visible=0)
display.start()
driver=webdriver.Chrome('/usr/local/bin/chromedriver')
URL="http://localhost:9012"
driver.get(URL)
screenshot=driver.save_screenshot('my_screenshot.png')
driver.quit()
def getserver():
SERV = raw_input('Please enter the server you would like to connect to: ')
return SERV
def connect_to_server(SERV):
print(SERV)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print('Connecting to ' + SERV)
ssh.connect(SERV, username='root', key_filename='...')
connected = True
print('Connected to ' + SERV)
time.sleep(30)
def main():
SERV = getserver()
p1 = multiprocessing.Process(name='p1', target=connect_to_server(SERV))
p2 = multiprocessing.Process(name='p2', target=grabscreendisplay())
p2.start()
p1.start()
if __name__ == "__main__":
main()
面临的问题
.png 仅显示与端口的连接失败('localhost 拒绝连接')
解决方案
SSH隧道
所以我不得不研究 SSH 隧道,它创建一个随机生成的本地绑定端口来映射远程目标端口。
简而言之,经过反复尝试,我设法得到了最终结果,但是,如果您正在寻找像我这样的问题的答案,我将提供我的代码以及一个希望适合所有人而不是我的具体问题的示例
from sshtunnel import SSHTunnelForwarder
import paramiko
import time
SSHTunnelForwarder.SSH_TIMEOUT = SSHTunnelForwarder.TUNNEL_TIMEOUT = 5.0
### Setting up the SSHTunnel ###
with SSHTunnelForwarder(
SERV, #IP of 10.10.10.1
ssh_username='admin',
ssh_pkey="...",
remote_bind_address=(SERV, 80), # map the 10.10.10.1 port 80
) as tunnel:
### preliminary SSH connection ###
client = paramiko.SSHClient() # set up SSH connection
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(SERV, username='admin', key_filename='...')
### Setting up the pyvirtualdisplay on local machine ###
display = Display(size=(1024, 768), visible=0) # set virtual window size
display.start()
driver=webdriver.Chrome('/usr/local/bin/chromedriver') # I'm using Chromedriver
print(tunnel.local_bind_port) # this prints the randomly generated local port, for example in my case it would be localhost:32842 and would display the web page of the remote host
time.sleep(5)
URL='http://localhost'+':'+str(tunnel.local_bind_port)
driver.get(URL)
time.sleep(10)
print(driver.title)
screenshot=driver.get_screenshot_as_file('newscreen.png')
简化
with SSHTunnelForwarder(
<REMOTE_HOST IP>,
ssh_username=<ssh_username>,
ssh_pkey=<location of own private key>,
remote_bind_address=(<REMOTE_HOST>, <REMOTE_PORT>),
) as tunnel:
client = paramiko.SSHClient() # set up SSH connection
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(<REMOTE_IP>, username=<ssh_username>, key_filename=<location of own private key>)
display = Display(size=(1024, 768), visible=0)
display.start()
driver=webdriver.Chrome('/usr/local/bin/chromedriver')
print(tunnel.local_bind_port)
while True:
sleep(30)
# ctrl + c to stop program
# Go into own local web browser and enter http://localhost:<local_bind_port> and you should see the web page
推荐阅读
- sql - 如何对 postgrsql 中具有联合的查询进行更新?
- asp.net - 在开发网站并对其进行测试时,浏览器是否会创建和存储缓存?
- swiftui - SWIFTUI 按钮或 NavigationLink?
- windows - cmd.exe /C 无法运行命令
- numpy - 将 Sklearn 与 NumPy 和图像一起使用并得到此错误 'setting an array element with a sequence'
- javascript - 获取错误类型错误:创建动态路由时无法读取 null 的属性“hasAttribute”
- javascript - 使用开始和停止按钮循环浏览网页
- sql - 语言“plpgsql”只需要一个 AS 项;
- c - 有没有办法制作一个错误计数器,在特定数量的用户输入后终止程序?
- amazon-web-services - 如何限制对 ALB 的访问,使其仅从 AWS 中的 Ec2 机器读取流量?