python 连接到远程主机并在本地主机上捕获网页

python connect to remote host and capture webpage on local host

我在这里查看了多处理,在大多数情况下,我已经缩小了范围,但最后一点由于某种原因失败了。

上下文

我有一个连接到的远程网络服务器,我已将 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 refused to connect')

SSHTunnel

所以我不得不研究 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

Website for Chromedriver