开发环境配置本地自签SSL证书

作者:matrix 发布时间:2024 年 6 月 20 日 分类:Linux PHP Wordpress

项目地址:https://github.com/FiloSottile/mkcert

本地开发环境有时候需要模拟真实的HTTPS环境,那就必须得配置SSL证书了。自签SSL证书就可以搞定,这回尝试用mkcert工具生成和配置自签SSL证书。

安装mkcert

本地是 mac 环境,直接用brew安装

brew install mkcert

信任自签根证书

安装并让系统信任mkcert的自签根证书。

mkcert -install 

创建证书

mkcert "*.security.local"  localhost 127.0.0.1 ::1

security.local就是我本地开发环境运行的域名
127.0.0.1 ::1 是对应的本地 IPV4 IPV6
创建的证书和私钥文件会保存在当前目录中

配置Nginx

正常配置nginx文件(e.g. /etc/nginx/nginx.conf)
添加内容:

server {
    listen 443 ssl;
    server_name localhost;

    ssl_certificate /path/to/localhost.pem;
    ssl_certificate_key /path/to/localhost-key.pem;

    # ...其余配置保持不变
}

# 可以选择添加一个额外的服务器块来处理 HTTP 到 HTTPS 的重定向
server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

说明:

/path/to/localhost.pem
/path/to/localhost-key.pem
这俩路径是证书和密钥文件位置

之后重启或者 reload nginx就可以了。 完美~~

利用mDNS协议使用局域网local域名服务

作者:matrix 发布时间:2024 年 6 月 5 日 分类:Linux

Multicast DNSmDNS)协议是一种用于网络设备自动发现的技术。通过mDNS协议,设备可以在局域网内声明自己的主机名,使其他设备不用配置域名DNS即可直接访问,非常方便~ 在Windows、Linux和Mac系统上,mDNS其实早就普及可用。

局域网中存在一台hostname为aaa的计算机,不管它是Windows还是Linux,用aaa.local可以找到它,这就是mDNS的功能


以 Debian 系统为例,为其创建局域网任何设备都可以访问的local域名。域名前缀就是机器名 hostname。我这里的名称是debianhs

Linux

Debian下需要安装avahi才能实现 mDNS 功能。avahi-daemon 可以支持 mDNS 的服务,允许设备在局域网内通过主机名相互发现和通信。

安装

sudo apt update
sudo apt install avahi-daemon

查看状态

sudo systemctl start avahi-daemon  # 运行服务
sudo systemctl enable avahi-daemon 
sudo systemctl status avahi-daemon # 查看服务状态

root@debianhs:~# systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
     Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-06-01 19:27:36 HKT; 1h 51min ago
TriggeredBy: ● avahi-daemon.socket
   Main PID: 720 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 4644)
     Memory: 888.0K
        CPU: 149ms
     CGroup: /system.slice/avahi-daemon.service
             ├─720 "avahi-daemon: running [debianhs.local]"
             └─721 "avahi-daemon: chroot helper"

其他系统

Mac系统自带 mDNS 功能,Windows10及最新系统也都包含。
如果 Windows版本较低可以通过安装 Bonjour Print Services (Windows)来满足。

或者你觉得 mDNS 支持依然不能覆盖到局域网的所有设备,当然你可以通过软路由形式 DNS 服务器来解决。so~ 我就是这样双重覆盖😂

TIPS

mDNS使用的是 5353 端口
如果局域网下存在重复机器名debianhs,后续加入的设备域名会自动添加后缀 比如 debianhs-2.local,机器名不会自动更改

参考:

https://en.wikipedia.org/wiki/.local
https://en.wikipedia.org/wiki/Multicast_DNS
https://datatracker.ietf.org/doc/html/rfc6762
https://blog.beanbang.cn/2019/08/07/locate-hosts-using-mdns/

Windows 10如何ping计算机名之mDNS


https://wiki.noodlefighter.com/%E8%AE%A1%E7%AE%97%E6%9C%BA/Linux/linux%E7%9A%84local%E5%9F%9F%E5%90%8D/

docker入门使用命令

作者:matrix 发布时间:2022 年 6 月 30 日 分类:Linux

目前docker在开发和生产环境中经常使用。就算不是RD,你在github中总会看到他的身影。很多程序的demo版本都有提供docker镜像,用起来真的很爽。完全看作轻量级别虚拟机。

详细教程最好是自己网上多寻,这里整理下自己经常用到的命令。

下载镜像

# 搜索线上就像
docker search centos 

# 下载到本地
docker pull centos 

创建容器

容器是基于镜像创建的

可以根据镜像运行一次性的容器,运行完成后会停止运行,不会被销毁

# 运行容器 如果没有则创建
docker run centos

# 创建同时运行 uname -a命令
docker run centos  uname -a

# 设定容器名称
docker run  --name haha centos

#创建后台运行的容器
docker run --name test --detach/-d centos ping baidu.com

# 创建ssh可交互的容器
docker run --interactive/-i --tty/-t --name ssh centos

docker run -it --name ssh centos

# 创建一次性容器 执行目录挂载。退出之后自行销毁
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data/web yha8897/nodejs-demo /bin/bash


# vue一键打包docker
#命令没有bash,命令完成后docker会自行退出,里面的分号;也可以换成&&
docker run  -it --rm  -v ~/localData/讯康/HealthExam_Standard/wwwroot/manager/web:/data yha8897/nodejs-demo sh -c 'cd /data;npm run build'

说明:
--interactive 可交互
--tty 输出到终端
--detach 后台驻留

查看正在运行的容器


docker ps # 查看所有容器 docker ps -a/--all

查看容器日志

 docker logs [容器name 或者 ID] 

 # 显示容器输出 类似tail -f
 docker logs --follow  [容器name 或者 ID]
 docker logs -f  [容器name 或者 ID]
 docker logs -t -f --tail=100 [容器name 或者 ID] 

容器ID可以缩写 比如只写前面几个字符。

查看容器启动的进程信息

# 查看容器db1ce9d2a3d0启动的进程信息 

$ docker container top db1ce9d2a3d0

停止/重启/删除容器

# 停止
docker stop haha

# 重启
docker restart haha

# 删除
docker rm [容器name 或者 ID] 

使用临时容器


docker run --rm -it --name mysql_demo -v ~/Desktop/master-bin.000040:/tmp/master-bin.000040 -p 3308:3308 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 /bin/bash

清理容器

清理已经不使用(包含退出状态)的所有容器

$ docker system prune -f 

清理镜像

清理已经不使用的所有镜像

$ docker image prune -a 

VIM命令收集

作者:matrix 发布时间:2022 年 5 月 31 日 分类:Linux

意识到vim命令是多么的强大,遂单独整理一份。

打开文件

$ vi ./file1

打开后定位到指定文本位置

$ vi ./file1 +/keywords

+表示追加后续操作命令
/keywords 表示自上而下搜索关键字keywords

进入文本编辑模式

i

进入命令行模式

esc键退出编辑模式,输入:进入命令行模式

退出

输入:q 退出 加!表示强制操作

搜索

/ 进入搜索,输入关键字回车 n 查找下一个

删除

删除/剪切 当前行:dd

清空所有行::%d 或者 :1,$d

% 匹配所有行
1,$ 匹配1到末尾行
d表示删除

移动 类似删除操作

  1. 光标落在上一行使用 dd 删除当前行;
  2. 再使用 p 粘贴删除的行;

粘贴

p

复制

yy复制单行

复制多行:

  • 当前行

1yy复制当前行

2yy复制当前到下一行
...

  • 指定行

:5,6y复制5-6行内容

显示行号

输入:set nu

还原 撤销

u撤销修改
control + r 还原撤销动作

保存退出

:wq!强制保存且退出

:q!仅强制退出

:ZZ 保存且退出 (注意是大写的ZZ)

移动光标

$当前行尾
^当前行首

A移动到行尾且编辑

I移动到行首且编辑

gg首行

GG尾行

文件对比

vim支持文件对比 使用-d模式

$ vi -d ~/Desktop/ocr1.png ~/Desktop/imageCode.png

图片5489-VIM命令收集

参考:

https://blog.csdn.net/weixin_37657720/article/details/80645991

https://www.jianshu.com/p/c1ad434723ed

http://www.cnblogs.com/chenlogin/p/6245958.html

GIT撤销修改

作者:matrix 发布时间:2022 年 4 月 1 日 分类:Linux

撤销本地修改

本地代码仅是修改,还未做任何提交(add/commit操作)

$ git checkout file_name_path_1  file_name_path_2 file_name_path_3...  #撤销指定文件的修改
$ git checkout .   #撤销所有文件的修改

git checkout会直接还原修改的文件到仓库版本

撤销add

$ git reset HEAD file_name_path1  #指定还原文件的add操作

$ git reset HEAD #还原所有文件

撤销commit

已经commit提交,没有push到远端

#修改(替换)掉上次的commit
$ git commit --amend -m "Fix bug #42" 

#撤销commit操作(保留修改)
$ git reset HEAD^  #回到上一提交版本

#撤销commit操作(放弃修改)
$ git reset --hard HEAD^

#手动reset 版本id
$ git reset [--soft|--mixed|--hard]   COMMIT_ID  #COMMIT_ID为需要还原到的正确版本(正确要保留的版本)

--mixed 会保留源码,只是将git commit和index 信息回退到了某个版本.

--soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.

--hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)

撤销push

还原已提交push的修改,本质是新增commit提交

方法1 还原指定版本的修改:

$ git revert COMMIT_ID #COMMIT_ID为需要撤销的版本(丢弃不要的版本)
$ git push #再执行推送

方法2 硬删除之后的所有提交:

$ git reset --hard COMMID_ID #最近提交需要的版本(删除之后的所有提交)
$ git push -f

http://www.ruanyifeng.com/blog/2019/12/git-undo.html

http://blog.csdn.net/zhangkongzhongyun/article/details/8025288

https://www.cnblogs.com/wuyun-blog/p/10026363.html

https://www.jianshu.com/p/37f3a7e4a193

vscode remote-ssh 内网穿透远程开发调试

作者:matrix 发布时间:2021 年 10 月 7 日 分类:command Linux

线上代码有时候会需要部署到内网或者防火墙后面的本地服务器环境,这个时候发布代码或者调试都会造成不便。

使用环境

测试环境为 mac vscode

windows版本的操作相差不大。

vscode作为ide编辑器,也作为文件管理工具来上传下载服务器文件。需要安装Remote - SSH插件完成这些功能。

目的

本地环境可以直接编辑操作远程服务器中的文件,当然这非常危险和忌讳!

修改文件前你需要做备份然后灾难还原 😀

路径也很清晰,通过中转来访问:

localhost -> jump -> target-service

本地电脑连接中转服务器,再通过中转服务器连接后端的target-service完成操作。

配置ssh

插件安装之后按F1键打开命令行,找到remote-ssh相关文件配置命令。
图片5271-vscode remote-ssh 内网穿透远程开发调试

或者可以直接修改~/.ssh/config文件

配置

# 中转服务器
Host jump-box
    HostName 118.X.X.11
    User root
    # IdentityFile ~/.ssh/jumpbox

# 需要连接的目标服务器 即后端的非暴露地址
# Target machine with private IP address
Host target-box
    HostName 192.168.1.11
    User root
    # IdentityFile ~/.ssh/target
    ProxyCommand ssh -q -W %h:%p jump-box

说明:
如果服务器有设置密钥登录,IdentityFile参数用于设置私钥文件地址。

连接

配置完成之后,点击左侧的remote - ssh插件的选项页面,就能看到配置的服务器。包含jump-box,target-box

图片5272-vscode remote-ssh 内网穿透远程开发调试

之后打开连接,点击右侧的文件夹📁图标打开新窗口,vscode会进行连接请求。若是密码登录请求则会让你输入密码,依次连接jump-box,target-box服务器,且最终停留在target-box服务器上,可以在线编辑操作非常方便。

vscode连接成功后,左下角会有绿色连接提示。

文件操作

和其他编辑器的基本功能都是一样,代码文件直接编辑保存,之后会自动上传到服务器。

如果想上传文件需要在vscode中找到要上传的文件或目录,点击右键复制。之后服务器的vscode窗口中点击右键粘贴。

图片5275-vscode remote-ssh 内网穿透远程开发调试

参考:

https://code.visualstudio.com/blogs/2019/10/03/remote-ssh-tips-and-tricks

http://kb.ictbanking.net/article.php?id=639

https://code.visualstudio.com/docs/remote/ssh

https://kenzoluo.github.io/2020/03/13/VScode%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E7%9A%84%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/

https://xirikm.net/2019/619-1

autossh自动输入密码且断线重连

作者:matrix 发布时间:2020 年 10 月 28 日 分类:command Linux

mac上使用ssh命令隧道转发访问内网会出现经常断连的情况,每次都需要重启窗口执行命令,没有windows上xshell上隧道设置来的简单好用。当然,后面我发现Termius.app支持端口转发后,依然觉得autossh的方式香~

换用autossh来代替ssh,只需要添加-M参数用于设定监听的本地端口,本地不被占用的都可以。

autossh安装

autossh就用来解决断线重连的问题。

测试环境为macos

autossh安装:brew install autossh

要自动免密码登录目前知道两个方法:

方法1 密钥登录

无密码密钥登录,配合autossh可以稳定使用。

方法2 autossh+expect

这里主要介绍自动输入密码的方式,可以解决各种场景的问题。

使用autossh+expect的方式用脚本操作,支持ssh登录密码、密钥密码都可配置输入,所以这个是真正能解决很多自动化处理的问题。

autossh.sh文件

#!/bin/bash
# macos下测试使用
# 执行之后在窗口中ctrl+c终止连接进程

PASS='XXXXX' #ssh登录密码
CMD=$@
BASE_CMD='/usr/local/bin/autossh' # autossh 执行路径
trap 'ps aux|grep "$BASE_CMD $CMD" |grep -v grep | awk "{print \$2}" | xargs kill &>/dev/null && echo "stop done.\n"' 2 # ctrl + c 按键后执行命令终止子进程

VAR=$(expect -c "
spawn $BASE_CMD $CMD
match_max 100000;

while (1) {
    # 匹配关键字password,之后发送密码
    expect \"*?password:*\" {send -- \"$PASS\r\"}

    # 下面的方式执行失败
    #set connectedFlag 0;
    # set timeout 60;
    # expect {
    #     '?sh: Error*'
    #         { puts 'CONNECTION_ERROR'; exit; }
    #     '*yes/no*'
    #         { send 'yes\r'; exp_continue; }
    #     '*?assword:*' {
    #          # send '$PASS\r'; set timeout 4;
    #          send -- \"$PASS\r\"
    #          expect '*?assword:*' { puts 'WRONG_PASSWORD'; exit; }
    #          set connectedFlag 1;
    #     }
    #     # if no password
    #     '*~*'
    #         { send 'echo hello\r'; set connectedFlag 1; }
    # }
}

")
echo "==============="
echo "$VAR"

tail -f /dev/null # 前台挂起主进程

注意:

密码中出现脚本元字符$需要转义处理\$

如果ssh命令指定密钥登录提示输入密码passphrase,一样的操作需要匹配关键字passphrase然后发送密码和回车符即可。

脚本中自动输入密码的实现方式也有其他,比如sshpass

使用

bash ./autossh.sh -M 1234  -p 22 -L 127.0.0.1:8088:182.18.1.2:8088 root@SERVER_HOST

说明:

-M 1234 :autossh的参数用于监听ssh是否断线。如果启动多个隧道命令,此端口不能重复使用,随意更换即可。

127.0.0.1:8088:182.18.1.2:8088,连接服务器后将服务器182.18.1.2:8088转发到本地127.0.0.1:8088

ctrl + c 按键终止

参考:

http://www.ouvps.com/?p=790

http://www.ouvps.com/?p=792

autossh参数参考:
http://www.freeoa.net/osuport/netmanage/autossh-useage-refer_2831.html

http://www.freeoa.net/osuport/netmanage/ssh-automatic-login-config_285.html

https://cloud.tencent.com/developer/ask/89349

https://blog.csdn.net/csdn_changsha/article/details/103631673

https://blog.mimvp.com/article/10072.html

https://www.cnblogs.com/hongdada/p/13711688.html

awk入门小记

作者:matrix 发布时间:2019 年 11 月 6 日 分类:command Linux

图片5055-awk入门小记

awk用于unix的文本处理,经常出现和使用。读取每一行文本进行格式化输出。

测试环境 Macos

awk简单操作

默认使用空格进行字符串分割

echo '1 2 3' |awk '{print $0}' # 1 2 3

echo '1 2 3' |awk '{print $3}' # 3

echo -e "1\n2\n3" |awk '/[23]/' #正则条件查找

echo -e "abc\n1a2\n33" |awk '/a/' #正则条件查找字母a 

awk '{print $3}' file_path #指定文件

ls -alh|awk '/^d/' #输出目录
# drwxr-xr-x    3 panc  staff    96B  7 16 23:32 pt-program

echo '1-2-3' |awk -F '-' '{print $2}' #指定分割符号 -  输出 2

$0表示当前行
$1表示第一个分割的字段

awk命令后面跟操作的语句字符串''包裹,每个语句段落用花括号{}包裹,语句段落中用分号;分隔语句。

echo -e '1 2 3\n4 5 6' |awk '{print $0;print("-end-")}'
echo -e '1 2 3\n4 5 6' |awk '{print $0;}{print("-end-")}'
#上面输出结果相同
#1 2 3
#-end-
#4 5 6
#-end-


echo -e '1 2 3\n4 5 6' |awk '{print $1,$3}'
#输出
#1 3
#4 6

使用内置变量

NF表示当前行有多少个分割字段

echo  '1-2-3' |awk -F '-' '{print $(NF)}' # 3  获取最后一个分割字符
echo  '1-2-3' |awk -F '-' '{print $(NF-1)}' # 2  获取倒数第二个分割字符

其他变量
NR表示当前处理的是第几行

BEGIN预处理

在执行处理之前提前设置一些信息
比如之前的-F参数可以使用BEGIN来设置

echo -e "a-b-c" |awk 'BEGIN{FS="-"} /^a/{print $0}' #设置分割符为-

echo -e "a-b-c" |awk 'BEGIN{FS="-";print "this title::"} {print $0}' #设置输出的首行标题

echo -e "1122\n3344" |awk 'BEGIN{FIELDWIDTHS="2 2";} {print $1,$2}' #固定字段宽度  (mac os中测试失败)
#输出
#11 22
#33 44

内置变量
FS字段分隔符
FIELDWIDTHS指定字段宽度
ORS指定输出的行分隔符

if逻辑处理

awk还可以支持函数和复杂的逻辑处理,完全可以在里面定义函数 调用 判断

例子:
显示红色error
绿色seccess
白色log


echo -e 'success\nerror\nsuccess\nloginfo' | awk \ '{ if (/error/) { print "\033[91m" $0 "\033[0m" } else if (/success/){ print "\033[32m" $0 "\033[0m"; }else{ print $0 } next; }'

上面语句有换行的段落方便阅览。一行简写也是可以
例子:
判断值大小

echo -e '12\n14\n232\n90' |awk '{if($0>=90) print $0}' #输出>=90的数据
#232
#90

for循环

使用for循环计算求和


echo '5' |awk '{ \ total = 0 for (var = 1; var < $0; var++) { total += var } print "total:",total }'

Built-In Functions函数使用

awk中语义中支持函数的使用

echo -e 'H htjim\nDot\ncom\n009' |awk '{print toupper($0)}'#转换为大写

内置函数
toupper 转换为大写
tolower 转换为小写
rand 随机数

其他函数参考手册:
https://www.gnu.org/software/gawk/manual/html_node/Built_002din.html#Built_002din

自定义函数

自定义彩色文字输出函数awk内部执行调用


echo -e 'success\nerror\nsuccess\nloginfo' | awk \ ' function red(s) { printf "\033[1;31m" s "\033[0m " } function green(s) { printf "\033[1;32m" s "\033[0m " } function blue(s) { printf "\033[1;34m" s "\033[0m " } { if (/error/) { print red($0) } else if (/success/){ print green($0) }else{ print blue($0) } }'

其他例子

结合tail -f log显示红色报错提示

 tail -f test.log |  awk '{
 if (/success/) {
 print "\033[91m" $0 "\033[0m"
 } else {
 print "\033[32m" $0 "\033[0m"; 
 }
 next;
}';

next用于直接跳到下一行文本进行执行 有点continue的意思

参考:
https://likegeeks.com/awk-command/

http://www.ruanyifeng.com/blog/2018/11/awk.html

https://www.cnblogs.com/Linuxprobe/p/5745381.html