首页
好物推荐
薅羊毛领红包
好看壁纸
更多
隐私政策
友情链接
时光机
搜索
1
使用 docker 快速安装 Home Assistant
4,439 阅读
2
Ipad mini2 降级到IOS10.3.3系统
2,521 阅读
3
Home Assistant集成OpenWrt
2,054 阅读
4
小米电视做大屏安装火狐浏览器教程
1,930 阅读
5
华为手机开启ADB进行WIFI远程调试
1,618 阅读
无分类
智能家居
心得随想
文档教程
登录
Search
标签搜索
Linux
JS
教程
CSS
HTML
配置
NodeJS
Docker
解决方案
文档
Git
Java
技术培训
Hadoop
Mac
Windows
RiotJS
Python
VPS
Home Assistant
DONG HAO
累计撰写
147
篇文章
累计收到
49
条评论
首页
栏目
无分类
智能家居
心得随想
文档教程
页面
好物推荐
薅羊毛领红包
好看壁纸
隐私政策
友情链接
时光机
搜索到
18
篇与
文档教程
的结果
2023-02-21
VSCode远程开发JAVA多模块项目
创建配置文件.vscode/settings.json{ "java.jdt.ls.java.home": "/usr/lib/jdk-17.0.6-10", "java.compile.nullAnalysis.mode": "automatic", "java.configuration.runtimes":[ { "name": "JavaSE-1.8", "path": "/usr/lib/jdk1.8.0_281", }, { "name": "JavaSE-11", "path": "/usr/lib/jdk-11.0.11", }, { "name": "JavaSE-17", "path": "/usr/lib/jdk-17.0.6-10", "default": true } ], "java.configuration.updateBuildConfiguration": "automatic", "maven.terminal.customEnv": [ { "environmentVariable": "JAVA_HOME", "value": "/usr/lib/jdk1.8.0_281", },{ "environmentVariable": "MAVEN_OPTS", "value": "-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" } ], "maven.executable.path": "/usr/local/apache-maven-3.8.1/bin/mvn", "maven.view": "hierarchical", "maven.executable.options": "-s /home/hadong/.m2/patsnap-settings.xml", "java.configuration.maven.userSettings": "/home/hadong/.m2/patsnap-settings.xml", "maven.settingsFile": "/home/hadong/.m2/patsnap-settings.xml", "java.debug.settings.onBuildFailureProceed": true, "java.import.gradle.java.home": "/usr/lib/jdk1.8.0_281", "java.import.gradle.wrapper.enabled": false, "java.import.gradle.version": "", "java.import.gradle.home": "/home/hadong/.sdkman/candidates/gradle/current/", "gradle.autoDetect": "on", "gradle.javaDebug.cleanOutput": true, "gradle.debug": true }.vscode/launch.json{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "java", "name": "Launch APP", "request": "launch", "mainClass": "com.patsnap.app.Application", "env": { "spring.profiles.active": "secret", "configs.com.patsnap.workspace.region": "DH", "configs.com.patsnap.dynamodb.table.track.ignore.regex.list": "workspace_folder_v2,workspace_task" }, "cwd": "${workspaceFolder}", "javaExec": "/usr/lib/jdk1.8.0_281/bin/java", "projectName": "workspace-service", "shortenCommandLine": "jarmanifest" } ] }
2023年02月21日
104 阅读
0 评论
0 点赞
2023-02-21
Linux 配置多JDK环境
下载多个版本的JDKhttps://www.oracle.com/java/technologies/downloads/#java11解压到/usr/lib目录我安装了3个版本JDK/usr/lib/jdk1.8.0_281 /usr/lib/jdk-11.0.11 /usr/lib/jdk-17.0.6-10分别注册环境alternatives --install /usr/bin/java java /usr/lib/jdk1.8.0_281/bin/java 8 alternatives --install /usr/bin/java java /usr/lib/jdk-11.0.11/bin/java 11 alternatives --install /usr/bin/java java /usr/lib/jdk-17.0.6-10/bin/java 17刷新配置update-alternatives --config java source /etc/profile java -version
2023年02月21日
55 阅读
0 评论
0 点赞
2023-02-09
MergeApi装饰器方案
定义一个接口可以入参数组当一个时间内的不同调用参数形成多个Api请求时候,可以合并请求,使用下面的合并请求装饰器装饰器import { mergeWith, isArray, unionWith, isEqual } from 'lodash' /** * log * @param type log类型 * @param id logId * @param input 输入 * @param pending 延时 */ function log(id: string, input: any, pending?: number) { console.group('%c%s(%s)', 'color:#0764E9;padding:2px;', '[MergeApi]', id) console.log('%c延时:', 'color:green;padding:2px;', `${pending} ms`) console.log('%c参数:', 'color:green;padding:2px;', input) console.groupEnd(); } export interface MergeApiConfig { delay?: number, debug?: boolean, } /** * 合并接口调用 * @param config 配置 * @returns */ export function MergeApi(config?: MergeApiConfig) { let cache: object = {}; let timer: number | null = null; let promise: Promise<any> = Promise.resolve(); return function(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) { const { delay = 500, debug = false, } = config || {} const key = `${target.name}.${propertyKey}` const method = descriptor.value; descriptor.value = function(arg: object = {}) { const input = JSON.parse(JSON.stringify(arg)) mergeWith(cache, input, (obj, src) => { if (isArray(obj)) { return unionWith(obj, src, isEqual); } }) if (timer) { return promise } promise = new Promise((resolve, reject) => { timer = window.setTimeout(() => { debug && log(key, cache, delay) method.apply(this, [cache]) .then(resolve) .catch(reject) clearTimeout(timer as number) timer = null cache = {} }, delay) }) return promise; } return descriptor } } 使用export class ApiTranslate { @MergeApi({ delay: 800, }) static translate(args) { return Promise... } }
2023年02月09日
41 阅读
0 评论
0 点赞
2023-02-09
MockApi装饰器方案
在项目开发初期,需要前后端约定数据结构,Mock数据开发的时候,可以使用下面的MockApi可以在控制台看到mock数据的结构,方便联调。装饰器import axios from 'axios' import type { AxiosRequestConfig } from 'axios' import { isFunction } from 'lodash' import { Random } from 'mockjs' export function MockGet(url: string) { return Mock({ url, method: 'GET', }) } export function MockPost(url: string) { return Mock({ url, method: 'POST', }) } export function MockPut(url: string) { return Mock({ url, method: 'PUT', }) } export function resolve<T>(data: T, delay = 1000): Promise<T> { return new Promise((resolve) => { setTimeout(() => { resolve(data) }, delay) }) } export function Mock(config: AxiosRequestConfig) { return function(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) { descriptor.value = function(...args: any[]) { return axios(config).then(({ data, }) => { // @ts-ignore const res = { error_code: 0, status: true, data, } console.warn('Mock', `[${config.method}] ${config.url}`, res, args); return res.data; }) } return descriptor } } /** * mockApiLog * @param type log类型 * @param id logId * @param input 输入 * @param output 返回 * @param pending 耗时 */ function mockApiLog(id: string, input: any, output: any, pending?: number) { console.group('%c%s(%s)', 'color:#0764E9;padding:2px;', '[MockApi]', id) console.log('%c耗时:', 'color:green;padding:2px;', `${pending} ms`) console.log('%c参数:', 'color:green;padding:2px;', input) console.log('%c返回:', 'color:green;padding:2px;', output) console.groupEnd(); } export interface MockApiConfig { pending?: number, } /** * 拦截接口调用,返回mock数据 * @param mock mock方法或者直接返回mock数据 * @returns */ export function MockApi(mock: any, config?: MockApiConfig) { return function(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) { let { pending, } = config || {} if (pending === undefined) { pending = Random.integer(200, 2000) } const key = `${target.name}.${propertyKey}` descriptor.value = function(...args: any[]) { const output = isFunction(mock) ? mock.apply(this, [...args]) : mock; const input = JSON.parse(JSON.stringify(args)) return resolve(output, pending).then(data => { mockApiLog(key, input, data, pending); return data }) } return descriptor } } 使用export function projectsMockData(...args: any[]) { const tagStructure = mock({ 'tagStructure|1-10': [ { id: '@id', name: '@cword(1, 5)', } ], }) return mock({ 'items|0-20': [{ id: '@id', name: '@ctitle(1, 10)', icon: () => Random.pick( Random.range(1, 6).map(i => `${i}`) ), description: '@cword(6, 30)', 'tags|3': [() => Random.pick(tagStructure.tagStructure).id], 'members|0-16': [ { id: '@id', name: '@cname', email: '@email', } ], update_ts: '@datetime', created_at: '@datetime', }], ...tagStructure, }); }@MockApi(projectsMockData, { pending: 1000, })
2023年02月09日
61 阅读
0 评论
0 点赞
2022-10-11
dpkg: 处理软件包 xxx (--configure)时出错解决方法
dpkg: 处理软件包 xxx (–configure)时出错:依赖关系问题 - 仍未被配置 dpkg: 依赖关系问题使得 xxx 的配置工作不能继续: xxx 依赖于 libicu-dev;然而: 软件包 libicu-dev 尚未配置。解决方法:#先切换到root用户 sudo su mv /var/lib/dpkg/info /var/lib/dpkg/info_bak mkdir /var/lib/dpkg/info apt-get update && apt-get -f install mv /var/lib/dpkg/info/* /var/lib/dpkg/info_bak/ rm -rf /var/lib/dpkg/info mv /var/lib/dpkg/info_bak /var/lib/dpkg/info完成
2022年10月11日
58 阅读
0 评论
0 点赞
2022-10-10
深度系统Deepin 15.11如何升级到V20版本
DeepinV20属于大版本号升级,如果还是15.11版本的用户,在设置界面的系统更新里面是无法进行更新的,界面中仍会显示系统是最新的。那如何才能升级到V20版本呢?跨版本升级操作如下:需要手动更改sources.list的软件源(/etc/apt/sources.list)1) 将原来的软件源改为:deb [by-hash=force] https://community-packages.deepin.com/deepin/ apricot main contrib non-free2) 打开终端执行如下命令:sudo apt update sudo apt upgrade3) 更新完成重启并再次更新后,新增20官方商店源(/etc/apt/sources.list.d/appstore.list ),没有该文件则新建:deb https://community-store-packages.deepin.com/appstore eagle appstore4)再次执行sudo apt update sudo apt-get dist-upgrade这样便完成了15.11到V20的升级。
2022年10月10日
229 阅读
0 评论
0 点赞
2022-09-04
小米电视开机广告和乐播投屏广告Hosts屏蔽列表
将以下Host加入路由器的广告拦截黑名单里面// 小米电视开机广告 gvod.aiseejapp.atianqi.com stat.pandora.xiaomi.com upgrade.mishop.pandora.xiaomi.com logonext.tv.kuyun.com config.kuyun.com mishop.pandora.xiaomi.com dvb.pandora.xiaomi.com api.ad.xiaomi.com de.pandora.xiaomi.com data.mistat.xiaomi.com jellyfish.pandora.xiaomi.com gallery.pandora.xiaomi.com o2o.api.xiaomi.com bss.pandora.xiaomi.com // 乐播投屏广告 hpplay.cdn.cibn.cc h5.hpplay.com.cn sdkauth.hpplay.cn imdns.hpplay.cn vipauth.hpplay.cn rp.hpplay.cn sl.hpplay.cn 519332DA.rtc.youme.im hotupgrade.hpplay.cn hotupgrade.hpplay.com.cn pin.hpplay.cn tvapp.hpplay.cn hpplay.cdn.cibn.cc image.hpplay.cn gslb.hpplay.cn rp.hpplay.cn cdn.hpplay.com.cn h5.hpplay.com.cn adeng.hpplay.cn conf.hpplay.cn adcdn.hpplay.cn g.dtv.cn.miaozhen.com android.bugly.qq.com alog.umeng.com hotupgrade.hpplay.cn pin.hpplay.cn
2022年09月04日
1,609 阅读
0 评论
2 点赞
2022-02-22
前端入门学习指南
基础教程1. HTML 教程 2. CSS 教程 3. JavaScript 教程 4. jQuery 教程进阶教程1. Vue2 教程 2. TypeScript 教程工具1. VSCode下载2. 开发文档快速查询3. Nodejs下载http-server轻量本地静态文件服务器安装# 先确定本地已经安装nodejs npm install --global http-server运行# 进入想要托管的项目文件夹内 http-server -c-1 --cors # 根据提示访问 http://localhost:8080 即可
2022年02月22日
125 阅读
0 评论
2 点赞
2022-02-07
Ipad mini2 降级到IOS10.3.3系统
下载Vieux并解压https://github.com/MatthewPierson/VieuxVieux支持的设备降级列表 iOS 10.3.3 iPhone 5s, iPad Air, iPad Mini 2 (Not iPad4,6) iOS 8.4.1 iPhone 5, iPhone 4s, iPad 2, iPad 3, iPad 4, iPad Mini 1, iPod 5 iOS 6.1.3 iPhone 4s, iPad 2 (Not iPad2,4)确保 python3.8python -V如何修改python版本参考这篇文章 https://blog.minws.com/archives/816/确保安装 libusbbrew install libusb使用原装苹果数据线连接电脑{alert type="success"}如何进入dfu模式?亮屏状态下同时长按home和电源键10s然后保持长按home并松开电源键10s进入dfu,dfu状态下默认是黑屏的{/alert}安装爱思助手1. 下载固件iPad_64bit_10.3.3_14G60_Restore.ipsw 2. 查看固件下载路径:~/Downloads/i4ToolsDownloads/Firmware/iPad_64bit_10.3.3_14G60_Restore.ipsw到Vieux文件夹里面运行# 确保python 3.8 python -V # 3.8 # 安装依赖 python install -r requirements.txt # 如果Unzipping后报错,ERROR: Unsupported model... # 执行如下补丁 # 运行 CatalinaFix ./CatalinaFix.sh # 在dfu模式下启动降级刷机 python vieux -i ~/Downloads/i4ToolsDownloads/Firmware/iPad_64bit_10.3.3_14G60_Restore.ipsw 机器会在两次进度条一次绿屏之后进入系统,这时系统成功降级到10.3.3。
2022年02月07日
2,521 阅读
0 评论
1 点赞
2022-02-07
Macos python 版本升降级控制(pyenv)
安装pyenvbrew install pyenv添加环境变量到~/.zshrc 或者 ~/.bash_profile中export PYENV_ROOT=/usr/local/var/pyenv if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi export PATH=${PYENV_ROOT}/shims:${PATH}应用环境变量source ~/.zshrc全局切换python版本pyenv global 3.8.11pyenv 使用# 1. 查看正在使用的python版本 $ pyenv version system (set by /usr/local/var/pyenv/version) # 2. 查看系统支持的python版本 $ pyenv versions * system (set by /usr/local/var/pyenv/version) 3.8.11 ## * 表示正在使用的python版本, system 表示系统自带的python # 3. 查看可以安装的python有哪些 pyenv install -l Available versions: 2.1.3 2.2.3 2.3.7 2.4 2.4.1 2.4.2 2.4.3 2.4.4 * * * # 4. 安装指定版本的pyton pyenv install 3.8.11 # 5. pyenv local 设置当前目录使用的python版本 $ mkdir py3 && cd py3 && pyenv local 3.8.11 # 验证: # MacBookPro in /tmp/py3 $ python -V Python 3.8.11 # MacBookPro in /tmp/py3 $ cd $ python -V Python 3.8.11 # 6. 全局切换python版本 $ pyenv global 3.8.11 (pyenv versions 可查看能使用的版本) # 7. 解除local设置 $ pyenv local --unset # 8. 切换回系统版本 $ pyevn global system # 9. 卸载python版本 $ pyenv uninstall 3.8.11
2022年02月07日
326 阅读
0 评论
0 点赞
2021-11-09
华为手机开启ADB进行WIFI远程调试
通过数据线将手机连接到电脑【开发者选项】-- 打开USB调试【开发者选项】-- 【仅充电】 -- 允许ABD调试开启TCP连接服务adb tcpip 5555连接手机,192.168.2.2替换为你自己的设备IPadb connect 192.168.2.2:5555拔掉数据线,查看连接设备adb devices如果需要断开调试adb disconnect 192.168.2.2:5555{message type="error" content="注意:如果断开数据线后不能成功连接,显示offline。一定要确保第3步 【开发者选项】-- 【仅充电】 -- 允许ABD调试 开启!"/}
2021年11月09日
1,618 阅读
0 评论
0 点赞
2021-11-05
Openwrt zerotier 设置
填入路由器配置填入zerotier的 id 勾选下面的允许客户端NATzerotier后台设置 zerotier地址允许授权 - 在你的路由器条目前打勾,允许加入网络添加路由{callout color="#f0ad4e"}前面是你路由器家里内网的IP段,后面是zerotier给你openwrt路由器分配的ip地址{/callout}{alert type="warning"}注意:前面是你路由器的IP段,后面是zerotier给你分配的IP,千万不要填反了家里和办公室的IP不能一致{/alert}
2021年11月05日
607 阅读
0 评论
1 点赞
2021-11-03
小米电视做大屏安装火狐浏览器教程
下载火狐TV版浏览器推荐 Firefox tv 4.7版本, 不要下载4.8版本,因为会有一个关不掉的提示! {cloud title="【阿里云盘】Firefox tv 4.7" type="default" url="https://www.aliyundrive.com/s/7yEsMWVqfxk" password=""/}{cloud title="【ApkMirror】Firefox tv 4.7" type="default" url="https://www.apkmirror.com/apk/mozilla/firefox-android-tv/firefox-android-tv-4-7-1-release/" password=""/}开启开发者模式打开电视的设置开启开发者模式:设置--关于--产品型号--遥控连续按5下OK键设备安全设置:设置 --账号与安全--允许ADB调试设备安全设置:设置--账号与安全--允许安装未知来源的应用远程连接电视首先查找电视的IP,从电视的设置 -- 网络信息中查看 (假设是 192.168.8.38)连接电视adb connect 192.168.8.38在电视上允许连接安装apkadb install ~/Downloads/firefox.apk调整分辨率作为大屏默认的1080分辨率肯定不够,我们要切换成4k分辨率adb shell wm size // 查看当前分辨率 Physical size: 1920x1080 adb shell wm size 3840x2160 // 修改成4k分辨率 adb shell wm size reset // 恢复原始分辨率其他几个用得到的命令远程命令行输入文字adb shell input text "hello"上传文件adb push ~/Downloads/test.jpg sdcard
2021年11月03日
1,930 阅读
0 评论
0 点赞
2021-10-27
按照css-grid的卡片排版
.grid{ display: grid; grid-template-columns: repeat(auto-fill, minmax({设计给的最小宽度}, {设计给的最大宽度})); grid-gap: {设计给的横向空间} {设计给的纵向空间}; // 不符合?的会被覆盖 justify-content: space-between; }{callout color="#f0ad4e"}来源:阮一峰的博客 CSS Grid 网格布局教程{/callout}
2021年10月27日
127 阅读
0 评论
1 点赞
2021-01-13
CSS Viewport 单位
移动设备上的最小字体大小不应该不于14px,为标题提供最小字体大小.title { font-size: calc(14px + 2vw); }计算它的等效的 vwvw = (Pixel Value / Viewport width) * 100移动端滚动问题:即使使用100vh,也会滚动,原因是地址栏的高度可见。.my-element { height: 100vh; /* 不支持自定义属性的浏览器的回退 */ height: calc(var(--vh, 1vh) * 100); }// 首先,我们得到视口高度,我们乘以 1% 得到一个vh单位的值 let vh = window.innerHeight * 0.01; // 然后,将`--vh`自定义属性中的值设置为文档的根目录一个属性 document.documentElement.style.setProperty('--vh', `${vh}px`);{callout color="#f0ad4e"} 来源:CSDN CSS Viewport 单位,很多人还不知道使用它来快速布局! {/callout}
2021年01月13日
157 阅读
0 评论
0 点赞
2019-03-05
JS监听VUE的HASH变化
(history) { let pushState = history.pushState; history.pushState = function(state) { if (typeof history.onpushstate === 'function') { history.onpushstate({ state: state }); } return pushState.apply(history, arguments); }; let replaceState = history.replaceState; history.replaceState = function(state) { if (typeof history.onreplacestate === 'function') { history.onreplacestate({ state: state }); } return replaceState.apply(history, arguments); }; })(window.history);window.onhashchange = window.onpopstate = history.onpushstate = history.onreplacestate = function() { console.log('change!')};
2019年03月05日
446 阅读
1 评论
0 点赞
2019-02-13
记一次阿里云被黑客使用RPCBind服务进行UDP反射DDoS攻击
最近总是收到阿里云的预警邮件:您的云服务器(xxx.xxx.xxx.xxx)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(UDP:ALL)的访问... 发现然后在收到预警时候立马登录上去看,发现rpcbind -w这个进程cpu使用率比较高,就查了下关于rpcbind服务的漏洞问题,发现如下:【风险详情】 RPCBind(也称Portmapper、portmap或RPCPortmapper)是一种通用的RPC端口映射功能,默认绑定在端口111上,可以将RPC服务号映射到网络端口号。它的工作原理是当RPC服务启动时,它会告诉RPCBind它正在监听的地址,以及它准备服务的RPC服务号;当客户端希望对给定的服务号进行RPC调用时,客户端首先需要联系服务器上的RPCBind,以确定应该在哪里发送RPC请求的地址。利用RPCBind进行UDP反射DDoS攻击的事件相对较少,这也是腾讯云安全今年以来捕获的首例利用云主机上的RPCBind服务进行UDP反射DDoS攻击的行为。不过其实早在2015年Level 3 Threat Research Labs就发现了这样一种新的攻击DDoS放大攻击形式,该反射方式放大系数最高可达28.4,US-CERT也在当时将该种攻击方式加入了UDP 攻击类型列表,具体可见https://www.us-cert.gov/ncas/alerts/TA14-017A 。 部分用户在云主机上启动RPCBind服务,服务绑定在默认TCP或UDP端口111,同时开放在外网,黑客通过批量扫描开放的111 UCP端口的服务器,利用UDP反射放大DDoS攻击原理发送虚假UDP请求,伪造源IP地址,将请求包中的源IP地址替换成攻击目标,反射服务器收到请求包发送响应来完成整个攻击流程。由于发送的请求包远小于响应,所以最终达到了反射放大的效果。 【修复建议】 服务被恶意利用的主要原因是RPCBind服务绑定在默认端口并开放在外网从而导致黑客可以访问并发送伪造的请求。 1.如果业务中并没有使用RPCBind服务,建议直接关闭 2.如果因业务需要必须使用RPCBind服务,建议通过安全组/防火墙等方式进行访问限制或者将其绑定在内网IP,不要开放在外网 解决因为我没有启用防火墙,也没有启用安全组策略。所以立马先开启iptables服务,教程参考https://blog.minws.com/archives/660/然后将RPCBind服务关闭,教程参考 https://blog.minws.com/archives/662/
2019年02月13日
423 阅读
0 评论
0 点赞
2018-04-11
Centos6搭建ngrok内网穿透服务
安装gogo下载地址 https://golang.org/dl///下载go安装包 wget https://dl.google.com/go/go1.10.1.linux-amd64.tar.gz //解压go安装包 tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz //编辑环境变量文件 nano /etc/profile //最后添加环境变量 export PATH=$PATH:/usr/local/go/bin //应用环境变量 source /etc/profile 安装ngrok 下载ngrok源码 cd /usr/local git clone https://github.com/inconshreveable/ngrok.git cd ngrok 生成证书在自生成证书时需要一个解析到服务器上的主域名,以xxx.com为例。 //临时变量 export NGROK_DOMAIN="xxx.com" //生成证书 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000 //将新生成的证书,替换掉assets/client/tls下的证书 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key 编译生成 ngrokd 服务端 这里是交叉编译,linux系统GOOS=linux,64位系统GOARCH=amd64,32位系统GOARCH=386 #当前系统可用go env查看 GOOS=linux GOARCH=amd64 make release-server 可能遇到的问题 问题1: GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/client/assets/assets_release.go \ assets/client/... make: bin/go-bindata: Command not found make: *** [client-assets] Error 127 解决方法:前往go安装目录的bin目录下找到go-bindata,将他移动到ngrok/bin下 (没有bin,可新建一个) 问题2: package code.google.com/p/log4go: Get https://code.google.com/p/log4go/source/checkout?repo=: dial tcp 216.58.197.110:443: i/o timeout 因为google被墙,如果服务器不在墙外或者没有FQ则无法访问到code.google.com. 解决方法:在 ngrok/src/ngrok/log 目录下找到 logger.go 文件,修改其中第4或5行的: log "code.google.com/p/log4go”为 log "github.com/keepeye/log4go" 3.问题3: GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata # github.com/jteeuwen/go-bindata src/github.com/jteeuwen/go-bindata/toc.go:47: function ends without a return statement make: *** [bin/go-bindata] Error 2 解决办法: https://github.com/inconshreveable/ngrok/issues/237 ngrok自启动脚本#!/bin/sh ### BEGIN INIT INFO # Provides: ngrokd # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: ngrokd # Description: # ### END INIT INFO NAME=ngrokd DAEMON=/usr/local/ngrok/bin/$NAME KEY=/usr/local/ngrok/assets/server/tls/snakeoil.key CRT=/usr/local/ngrok/assets/server/tls/snakeoil.crt DOMAIN="xxx.com" HTTPADDR=":80" HTTPSADDR=":443" TUNNELADDR=":4443" case "$1" in start) echo "Starting $NAME..." nohup $DAEMON -tlsKey=$KEY -tlsCrt=$CRT -domain=$DOMAIN -httpAddr=$HTTPADDR -httpsAddr=$HTTPSADDR -tunnelAddr=$TUNNELADDR >/dev/null 2>&1 & ;; stop) echo "Stopping $NAME..." sudo ps -ef|grep $NAME|grep -v grep|cut -c 9-15|xargs kill -9 ;; restart) $0 stop && sleep 2 && $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0 编译生成 ngrok 客户端#这里是交叉编译,linux系统GOOS=linux,64位系统GOARCH=amd64,32位系统GOARCH=386 #当前系统可用go env查看 Linux 32位 linux 386 Linux 64位 linux amd64 Windows 32位 windows 386 Windows 64位 windows amd64 Mac OS 32位 darwin 386 Mac OS 64位 darwin amd64 Linux ARM linux arm GOOS=windows GOARCH=amd64 make release-client 添加iptable规则(4443),如果需要。iptables -I INPUT -p tcp --dport 4443 -j ACCEPT /etc/init.d/iptables save service iptables restart 启动ngrok客户端//ngrok.cfg server_addr: "xxx.com:4443" trust_host_root_certs: false tunnels: http: subdomain: "www" proto: http: "8090" https: subdomain: "www" proto: https: "8090" ssh: remote_port: 2222 proto: tcp: "22" //run ngrok -config ngrok.cfg start http https ssh
2018年04月11日
307 阅读
0 评论
0 点赞