1. 本文简介
家里没有公网ipv4,公网ipv6默认不能直接访问,懒得找电信公司去要DDNS和公网地址了。但是本文适用于所有的这种场景。
本文使用cpolar这个内网穿透工具实现对服务器不用登录官网查地址的访问。
简单来说,就是由于免费的cpolar账户不能固定端口,每次登录服务器都需要查看地址和端口,有些麻烦。这里用爬虫抓取当前的地址和端口,进行自动化登录。不用再自己手动打开网页,每次都输入地址和端口,这里只需要输入密码即可。
如果有条件,请支持cpolar其他非免费版本,以获得更好的体验。
2. 实现
2.1 安装与卸载cpolar
限于篇幅限制,cpolar的账号注册、cpolar的安装和卸载这里不再详述,这里给出官网教程连接,直接参考官网即可了,第一个是所有平台的,第二个是Ubuntu平台的,写的都非常详细。需要注意的是就是需要一个token认证。
- https://www.cpolar.com/blog/cpolar-download-and-install
- https://www.cpolar.com/blog/ubuntu-users-install-cpolar
2.2 使用cpolar登录服务器
正常的流程使用cpolar进行登录服务器的流程是:
- 打开cpolar官网, https://www.cpolar.com;
- 点击登录,输入账号密码,登录账号;
- 打开状态页,查看当前给分配的地址和端口;
- 使用ssh连接服务器。
让程序替代我们去干这4件事,减少打开浏览器查看等麻烦事情。最后登录的时候,唯一需要干一件事情就是需要输入服务器的密码。
我这里使用的python版本是Python 3.x,请自行pip安装requests 和bs4 两个第三方库。下面的代码需要修改的是如下前3个。
- 账号,也就是你注册好的cpolar账号
- 密码,即设置的cpolar登录密码
- 用户名,待访问服务器上的默认用户名。其实也可以在访问的时候后面跟上你需要的用户名,这样就不需要这里再设置了。
csrf_token 不知道是不是会变,也不知道是不是都一样,姑且认为是一样的。如果有改变,则需要自己查看网页中的csrf_token 。在登录页面,查看源码并搜索即可。
import requests
import os
import sys
import re
from bs4 import BeautifulSoup
def browser(url):
login_page = 'https://dashboard.cpolar.com/login'
try:
session = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
params = {
'login': '1. 账号',
'password': '2. 密码',
'csrf_token': '1538662349.68##b5aa35f374452a6198004dab20d88b13583c7c2c'
}
resp = session.post(login_page, params, headers=headers)
resp = session.get(url, headers=headers)
data = resp.content.decode('UTF-8')
return data
except Exception as e:
print(str(e))
def parse_html(html):
ret = []
css_rule = '#dashboard > div > div:nth-child(2) > div.span9 > table > tbody > tr > th > a'
soup = BeautifulSoup(html, features="html.parser")
items = soup.select(css_rule)
for item in items:
pat = 'tcp://(.*?):(\d+)'
rs = re.match(pat, str(item.text))
ret.append({'address': rs[1], 'port': rs[2]})
return ret
def parse_args():
if len(sys.argv) == 1:
name = '3. 服务器用户名'
else:
name = sys.argv[1]
return name
def main():
url = 'https://dashboard.cpolar.com/status'
html = browser(url)
raw_sshs = parse_html(html)
print(raw_sshs)
name = parse_args()
for ssh in raw_sshs:
os.system('ssh %s@%s -p %s' % (name, ssh['address'], ssh['port']))
if __name__ == '__main__':
main()
3. 注意
我猜测这里因为cpolar的缘故,应该没法实现自动登录了。所以我删除了一些读取写入ssh config的代码,如果出现问题,请自行debug吧。
免责声明:
这里使用的是自己的主机搭建的Linux服务器,如果用于生产网络等商用场景,出现问题本文概不负责。 同时在本文写作时,cpolar自身的robots.txt声明如下,并未禁止爬虫。
User-agent: *
Disallow:
Sitemap: https://www.cpolar.com/sitemap.xml
|