【环境配置】反向SSH——家中电脑连接校园内网服务器

博客围绕使用家中无公网IP电脑通过ssh控制校园内网GPU服务器展开。介绍了实现思路,以有公网IP的云服务器为桥梁,让校园内网服务器反向ssh连接云服务器。还说明了在校园内网服务器的配置过程,以及在家用电脑的使用示例,包括登录和文件传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 需求描述

1.1 具体情境

实验室有一台校园内网GPU服务器,校园内网的特点是只允许内网机器主动访问外网机器,而不允许外网机器主动访问内网机器。

现在需要使用家中的电脑(无公网IP的机器,其可能是另一个单位内网或家用路由器分配IP的机器),通过ssh控制校园内网的GPU服务器。

1.2 实现思路

假设校园内网的GPU服务器为机器A,在家中的电脑为机器C,具有公网IP的云服务器为B(公网IP的机器B需要购买阿里云或者腾讯云的服务器)。

在这里插入图片描述

由于机器B具有公网IP,机器C和机器A都可以通过主动连接找到机器B,所以我们可以将B作为A与B之间的桥梁。

首先使用机器 A 通过反向 ssh 连接机器 B ,然后机器 C 使用 ssh 连接 B 就可以通过该反向 ssh 对 A 进行操作了。

1.3 实现要求
  • 能使用家中的电脑 C 通过 ssh 对校园内网GPU服务器 A 进行操作
  • 每当GPU服务器 A 开机,就自动连接云服务器 B (前提是要确保机器A能访问外网)

2. 配置过程 (以下指令全部在机器 A 中执行)

校园内网GPU服务器(机器A):
公网IP:无
用户名:gpu401


腾讯云(机器B):
公网IP: 666.666.666.666
用户名:ubuntu

2.1 配置autossh免密登陆 (A连接B)
# 设置ssh免密码登录,使得 A 能免密码登录 B
ssh-keygen -t rsa # 一路回车,生成的id_rsa.pub文件在~/.ssh/文件夹里面。
# 将 A 中的这个key推送到vps,使用如下命令进行推送到 B
ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu@666.666.666.666 -p 22

# 安装autossh,其能确保 A-B 之间的 反向 ssh 能断线自动重连
apt-get install autossh

# 测试 autossh + 免密登录是否成功。
autossh -M 9991 -NfR 8990:localhost:22 ubuntu@666.666.666.666

'''
    如果该测试指令在 A 执行后,当 B 执行指令 'watch -n 1 netstat -tnlp' 能
    看到以下红框的端口号,则说明测试通过。
'''

[外链图片转存失败(img-1geVStzi-1562760515809)(715FB3E711184BC9B5BE7FCBBD510187)]

2.2 配置 A 开机启动反向ssh
# 使用systemctl来控制服务的注册以及启动

# 创建autossh.service
vim /lib/systemd/system/autossh.service

# 将下面的内容加进去
[Unit]
Description=Auto SSH Tunnel
After=network-online.target
[Service]
User=gpu401
Type=simple
ExecStart=/usr/bin/autossh -NR 9888:localhost:22 -i /home/gpu401/.ssh/id_rsa ubuntu@666.666.666.666 -p 22 >> /dev/null 2>&1
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
KillMode=process
Restart=no
[Install]
WantedBy=multi-user.target
WantedBy=graphical.target

注意,由于当时是使用了 机器A 中的用户 gpu401 来免密登录 机器B 的, 因此上述配置文件中 [Service]UserExecStart 都需要进行正确配置。

# 之后执行
systemctl enable autossh
systemctl start autossh

# 使用以下指令,查看是否成功启动
systemctl status autossh

'''
    如果运行成功,当 B 执行指令 'watch -n 1 netstat -tnlp' 能
    看到以下红框的端口号,则说明测试通过。
'''

[外链图片转存失败(img-j7HtYCa2-1562760515810)(40B54C728F2540319A67D4E272AD2C32)]

3. 使用示例(以下指令全部在机器C中执行)

3.1 使用机器 C 登录 机器A
# 首先机器 C 通过 ssh 登录机器 B,然后在 shell 中输入以下指令登录机器A:
ssh -p 9888 gpu401@127.0.0.1
3.2 上\下传文件
# 从机器 A 下载整个目录到机器 B
scp -r username@servername:/var/www/remote_dir/(远程目录) /var/www/local_dir(本地目录)

# 从机器 A 上传目录到机器 B
scp -r local_dir username@servername:remote_dir

# 上传文件同理,取消参数 '-r' 即可
scp local_fileName username@servername:remote_dir
### 编写或获取用于在Boss直聘平台上实现一键投递简历功能的脚本 #### 使用Selenium库准备环境 为了能够顺利运行Python编写的自动化脚本,需先安装好必要的开发环境。这包括下载并配置Python解释器以及通过pip工具来安装`selenium`包[^3]。 ```bash pip install selenium ``` #### 初始化WebDriver实例 选择合适的浏览器驱动对于启动和控制页浏览至关重要。这里以Chrome为例说明初始化过程: ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time service = ChromeService(executable_path='/path/to/chromedriver') driver = webdriver.Chrome(service=service) # 打开目标站 url = 'https://www.zhipin.com/' driver.get(url) time.sleep(5) # 等待页面加载完成 ``` #### 登录账号 由于涉及个人信息保护,在执行任何操作前应当登录个人账户。通常情况下,可以通过模拟输入用户名密码的方式来进行登录验证;然而更推荐的做法是利用已有的Cookies数据直接跳过此步骤,从而提高效率减少风险。 ```python cookies = [{'domain': '.zhipin.com', 'httpOnly': False, 'name': '_za', 'path': '/', 'secure': True, 'value': ''}] for cookie in cookies: driver.add_cookie(cookie_dict=cookie) driver.refresh() ``` #### 定位职位列表与筛选条件设置 根据实际需求调整搜索参数,比如关键词、城市范围等,并定位到具体的职位条目上以便后续处理。 ```python search_input = driver.find_element(By.ID, "query") search_button = driver.find_element(By.CLASS_NAME, "btn") # 输入查询词并提交表单 search_input.send_keys("软件工程师") search_button.click() wait = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".job-list li")) ) jobs = wait[-1].find_elements(By.TAG_NAME, "a") print(f"共找到 {len(jobs)} 条记录.") ``` #### 遍历职位详情页实施投递动作 遍历每一个符合条件的工作链接进入其详细介绍界面,按照设定逻辑判断是否满足自动申请的标准,如果符合则触发相应的按钮点击事件完成在线递交流程。 ```python for job_link in jobs[:min(len(jobs), 5)]: try: job_url = job_link.get_attribute('href') driver.execute_script("window.open(arguments[0]);", job_url) handles = driver.window_handles driver.switch_to.window(handles[-1]) apply_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.LINK_TEXT, "立即申请")) ) apply_btn.click() confirm_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[text()='确认']")) ) confirm_btn.click() print(f"{job_url} 已成功发送求职意向!") driver.close() # 关闭当前标签页 driver.switch_to.window(handles[0]) # 切换回初始窗口 except Exception as e: print(e) continue finally: input("按任意键退出...") driver.quit() ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值