Windows下ssh-config文件的作用

.ssh/config 本质上就是 SSH 的连接配置文件。 它最适合这些场景: 多个 Git 账号; 多个服务器; 不同服务器使用不同端口; 不同主机使用不同私钥; 想给复杂 SSH 地址起一个简单别名。 配置好以后,日常使用 Git 或 SSH 会方便很多,也能避免每次手动指定一堆参数。 ...

2025年4月25日 · 1 分钟 · 浅忆

生产环境对于文件服务注意事项

生产环境对于文件服务,尤其是对外提供访问的场景,需要注意以下几点,以防止伪装文件被解析执行等安全风险,从而被黑产利用上传恶意文件,如上传 html 作为钓鱼、菠菜、跳转 进行传播,利用你的域名当作跳板,导致域名封、通报、用户上当受骗等问题。 ...

2025年2月7日 · 2 分钟 · 浅忆

Minio Docker 搭建

创建数据和配置目录 1 2 mkdir -p /opt/minio/{data,config,init} cd /opt/minio 创建docker-compose.yml 注意: 此配置中 minio 的环境变量不能设置MINIO_SERVER_URL(文章末尾会有说明),除非服务器做了 FQDN,否则会出现webui页面登录不上的情况,即报错{"message":"invalid Login"},但可配置MINIO_BROWSER_REDIRECT_URL做webui的重定向。 以下的镜像是minio最后一个带web控制台的版本,如果需要最新版本请参考Minio官方文档。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 version: "3.8" services: minio: image: minio/minio:RELEASE.2025-04-22T22-12-26Z container_name: minio restart: unless-stopped # 对外端口:9000(S3 API) 9001(Console) ports: - "9000:9000" - "9001:9001" # 数据和配置持久化 volumes: - ./data:/data - ./config:/root/.minio # 生产建议:用 .env 管理账号密码 environment: # 管理员账号密码(必须设置;不建议用默认值) MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} # 可选:设置对外显示的访问地址 # 未做 FQDN 不要设置 # MINIO_DOMAIN=example.com # 服务器地址,未做 FQDN 不要设置 # MINIO_SERVER_URL=http://example.com # 控制台地址,仅设置 重定向 控制台地址 # MINIO_BROWSER_REDIRECT_URL: "https://console.example.com" # 启动命令 command: server /data --console-address ":9001" # 健康检查:MinIO 自带 health endpoint healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 配置 .env 1 2 MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=Password_123! 启动 在 docker-compose.yml 所在目录运行: ...

2025年1月30日 · 4 分钟 · 浅忆

关于续订程序出现授权出错问题

由于微软将续订程序的回调地址拉黑(会认为使用此回调地址的应用为钓鱼应用),从而将创建的 应用程序 禁用,导致应用无法进行授权。 之前已经授权过的应用暂时不影响(在应用 access_token有效期内),今天会临时加急更新一版,明天下午上线,临时解决这个问题。 同时新版本预计年后上线。 查看应用是否被禁用

2023年1月14日 · 1 分钟 · 浅忆

为知笔记 Docker版本 私有部署

目前已经使用docker私有部署的为知快2年了,之前用过 onenote、印象笔记、有道笔记、notion、蚂蚁笔记等等,全部用过一段时间后还是选择了为知笔记,一是服务的在自己手里,数据配合脚本实时同步到OneDrive,二是目前重构版的客户端确实好用很多,不像之前要卡半天~ 看网上一直在吹这个notion,不得不说操作上确实很爽,但每次打开不嫌慢吗? 下面是为知的docker搭建方式,其实官方写得很清楚了~ 1 2 3 4 5 6 7 8 docker run --name wiz \ --restart=always \ -it -d \ -v ~/wizdata:/wiz/storage\ -v /etc/localtime:/etc/localtime \ -p 8080:80 \ -p 9269:9269/udp \ wiznote/wizserver nginx 反代 1 2 3 4 5 6 7 8 location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header x-wiz-real-ip $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://ip:8081; }

2021年12月4日 · 1 分钟 · 浅忆

2021黑五 杜甫收获

SYS独服 24.99欧元 标准配置 SYS-2-SAT-32 Server - Intel Xeon D1540 - 32GB DDR3 ECC 2133MHz - 4x 2To HDD Soft RAID 250Mbps 开机结果 cpu升级为 Intel Xeon D1541 硬盘升级为 4x4T 开了3台结果如下: 1 2 3 12-01 21:23 GRA2 d1541 4x4T 250m 硬盘均 120小时 12-02 13:02 GRA1 d1541 4x4T G口 3个硬盘6k小时,1个110小时 12-02 13:30 GRA1 d1541 4x4T 250m 3个新盘,1个1k小时 准高配:D-1540+16T硬盘+250Mbps网络 高配:D-1541CPU+16T硬盘+250Mbps网络 顶配:D-1541CPU+16T硬盘+1Gbps网络 KS独服 14.99欧元 标准配置 1 KS-LE Server - Intel Xeon E5-1620v2 - 32GB DDR3 ECC 1133MHz - 2x 2To HDD Soft RAID 100Mbps 开机结果 机器1 ...

2021年12月2日 · 1 分钟 · 浅忆

gson java.lang.NumberFormatException: empty String

问题: 反序列化时实体类型为 int/Integer/Long 等等,而json字段为string,如下 1 2 3 4 5 6 #json {"a":""} #伪代码 class test { private Integer a; } 解决方法: 为gson注册一个适配器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import com.google.gson.JsonSyntaxException; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; public class IntTypeAdapter extends TypeAdapter<Integer> { @Override public void write(JsonWriter out, Integer value) throws IOException { out.value(value); } @Override public Integer read(JsonReader in) throws IOException { JsonToken peek = in.peek(); if (peek == JsonToken.NULL) { in.nextNull(); return null; } try { String result = in.nextString(); if ("".equals(result)) { return null; } return Integer.parseInt(result); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } } } 1 2 3 4 private Gson gson = new GsonBuilder() .registerTypeHierarchyAdapter(Integer.class, new IntTypeAdapter()) //.registerTypeHierarchyAdapter(Long.class, new LongTypeAdapter()) .create(); 需要注意的是, registerTypeHierarchyAdapter 里的类型一定要准确,一开始百度出来的是用 Number,会无法进入适配器,比如 https://www.jianshu.com/p/081ab69cf9a8 ,注册的是 int和integer,但TypeAdapter 是number。 ...

2021年9月2日 · 1 分钟 · 浅忆

javax.mail.FolderClosedException 异常

在测试 javax.mail 中的 imap 协议 idle 时会有olderClosedException异常。 背景 在Messaging对象上调用方法并且拥有该对象的Folder由于某种原因而死亡时,将引发此异常。 由于我没注意看文档,IMAPFolder.idle();是阻塞的而又没有循环读,导致直接关闭了资源~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 收件箱中共633封邮件! 收件箱中共78封未读邮件! 收件箱中共0封新邮件! 收件箱中共0封已删除邮件! ------------------------开始解析邮件---------------------------------- 支持idle Got 1 new messages --------------------------------------------------- -----关闭资源----- 标题: Re:测试邮件推送 javax.mail.FolderClosedException at com.sun.mail.imap.IMAPMessage.getProtocol(IMAPMessage.java:169) at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1546) at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:808) at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1508) at io.qyi.qqBotManage.mail.mail$1.messagesAdded(mail.java:88) at javax.mail.event.MessageCountEvent.dispatch(MessageCountEvent.java:154) at javax.mail.EventQueue.run(EventQueue.java:170) at java.lang.Thread.run(Thread.java:745) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 import com.sun.mail.imap.IMAPFolder; import javax.mail.*; import javax.mail.event.MessageCountAdapter; import javax.mail.event.MessageCountEvent; import java.io.IOException; import java.util.Properties; /** * @author LuoYe * @version 1.0 * @description: TODO * @date 2021/5/12 3:13 */ public class mail { public static void main(String[] args) throws MessagingException, IOException { init(); } public static void init() throws MessagingException, IOException { Properties props = new Properties(); props.setProperty("mail.store.protocol", "imap"); props.setProperty("mail.imap.host", "outlook.office365.com"); props.setProperty("mail.imap.port", "993"); /*tls与https需要增加以下代码*/ props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.imap.socketFactory.fallback", "false"); props.setProperty("mail.imap.socketFactory.port", "993"); Session session = Session.getInstance(props); // 创建IMAP协议的Store对象 Store store = session.getStore("imap"); // 连接邮件服务器 store.connect("账户", "密码"); // 获得收件箱 Folder folder = store.getFolder("INBOX"); // 以读写模式打开收件箱 folder.open(Folder.READ_WRITE); // 获得收件箱的邮件列表 Message[] messages = folder.getMessages(); // 打印不同状态的邮件数量 System.out.println("收件箱中共" + messages.length + "封邮件!"); System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!"); System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!"); System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!"); System.out.println("------------------------开始解析邮件----------------------------------"); // 解析邮件 /*for (Message message : messages) { IMAPMessage msg = (IMAPMessage) message; String subject = MimeUtility.decodeText(msg.getSubject()); System.out.println("[" + subject + "]未读,是否需要阅读此邮件(y/n)?"); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String answer = reader.readLine(); if ("y".equalsIgnoreCase(answer)) { System.out.println(msg.getContent().toString()); // POP3ReceiveMailTest.parseMessage(msg); // 解析邮件 // 第二个参数如果设置为true,则将修改反馈给服务器。false则不反馈给服务器 // msg.setFlag(Flag.SEEN, true); //设置已读标志 } }*/ folder.addMessageCountListener(new MessageCountAdapter() { @Override public void messagesAdded(MessageCountEvent e) { // super.messagesAdded(e); Message[] msgs = e.getMessages(); System.out.println("Got " + msgs.length + " new messages"); for (Message msg : msgs) { System.out.println("---------------------------------------------------"); try { System.out.println("标题: " + msg.getSubject()); System.out.println("内容: " + msg.getContent().toString()); } catch (MessagingException messagingException) { messagingException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } } } @Override public void messagesRemoved(MessageCountEvent e) { super.messagesRemoved(e); } }); if (folder instanceof IMAPFolder) { System.out.println("支持idle"); IMAPFolder f = (IMAPFolder) folder; f.idle(); } System.out.println("-----关闭资源-----"); // 关闭资源 folder.close(false); store.close(); } }

2021年5月12日 · 2 分钟 · 浅忆

pfSense HTTP_REFERER 登录校验问题

1 An HTTP_REFERER was detected other than what is defined in System -> Advanced (http://x.x.x.x/services_dhcp.php). If not needed, this check can be disabled in System -> Advanced -> Admin 问题: 由于服务器有多个ip,所以我就想装一个软路由来统一控制,刚装上pfSense 就无法在web登录,google搜索了半天才搜到,还是错的…… 解决办法: 1、vnc进入 PHP shell + pfSense tools 2、执行 playback disableref erercheck 注意: 一开始我搜索到的解决办法是由pfSsh.php执行,也就是 1 pfSsh.php playback disablereferercheck 但是在新版(2.5.0)执行无任何效果,低于这个版本的可以尝试这条命令。

2021年4月10日 · 1 分钟 · 浅忆

小米内测自动答题脚本

为啥要搞这个脚本呢,是真的被恶心到了,我记得我还是从高二开始就用的小米,MIUI从以前的真香,变成BUG一堆、负优化的UI。买了个小米11,到手3个月真心被这系统恶心到了,越更新越辣鸡,什么哈曼音效砍了(MIUI 12.0.22),4600ma的电池用着和老手机没什么区别,1月份首发到手,结果现在4月初所谓的MIUI12.5还没出来,以前可以随便刷开发版,现在也要个申请,关键是tmd不让过,无法了…… 这个脚本本来是打算为了答题申请内测,现在搞完反而没想法了,等用坏了以后就不用小米手机。 本脚本仅交流使用,不提供任何技术支持。 效果如下: 脚本运行环境是auto.js免费版4.0,看了半个小时直接开始撸了,附带采集功能,题库中没有的题目自动入库,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 toast("开始运行!"); // click("再次答题"); // click("同意协议并开始答题"); var myAPP = {}; // 唯一的全局变量myAPP myAPP.packageName = "com.xiaomi.vipaccount"; console.log('查找题目'); var patt = /,,.*(?=多选题|单选题)/g; for (let i = 0; i < 40; i++) { let title = textContains("选题").findOne().text(); console.log('?????????') var reg=new RegExp(patt); var result = reg.exec(title); // console.log('题目',title); title = result[0].replace(',,','').replace(' ',''); console.log(result[0]); // break; if (title == undefined) { continue; } console.log("题目:", title); // console.log(title.textMatches(patt)); let an; try { an = textContains("未选中").find(); } catch (error) { console.log('异常'); } /*增加题目到题库*/ let post = {}; post.question = title; for (let i = 0; i < an.length; i++) { let an_t = an[i].text().replace(',未选中', ''); if (i === 0) { post.answer_a = an_t; } else if (i === 1) { post.answer_b = an_t; } else if (i === 2) { post.answer_c = an_t; } else if (i === 3) { post.answer_d = an_t; } } // console.log(JSON.stringify(post)); let url = "http://192.168.15.227:8012/add_question"; let url_select = "http://192.168.15.227:8012/getQuestion?title=" + title; var r = http.get(url_select); var data_j = JSON.parse(r.body.string()); console.log('返回结果:', data_j); if(data_j.code === -1){ // 没有题库,直接提交到数据库 http.postJson(url, post); console.log(post); click(post.answer_a + ",未选中"); sleep(1000); click("下一题"); }else{ // data_j. var nc = Number(data_j.data.answer); console.log('答案',nc); if ((nc & 16) === 16) { console.log('点击',data_j.data.answer_a + ',未选中'); click(data_j.data.answer_a); } if ((nc & 32) === 32) { console.log('点击',data_j.data.answer_b + ',未选中'); click(data_j.data.answer_b); } if ((nc & 64) === 64) { console.log('点击',data_j.data.answer_c +',未选中'); click(data_j.data.answer_c); } if ((nc & 128) === 128) { console.log('点击',data_j.data.answer_d + ',未选中'); click(data_j.data.answer_d); } sleep(1000); click("下一题"); } } 不知道为啥,正则那里用了前置断言就报错…… ...

2021年4月1日 · 7 分钟 · 浅忆