代码的尽头是数学
万万没想到TNND当年的代数几何就二三十分, 现在涉及点算法就要用到数学,
还特么要用到π、e 、辗转相除法。
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo curl -o /etc/apt/trusted.gpg.d/angie-signing.gpg https://angie.software/keys/angie-signing.gpg
echo "deb https://download.angie.software/angie/$(. /etc/os-release && echo "$ID/$VERSION_ID $VERSION_CODENAME") main" | sudo tee /etc/apt/sources.list.d/angie.list > /dev/null
sudo apt-get update
sudo apt-get install -y angie
wget https://github.com/maxname/angie-panel/releases/download/v0.2.3/angie-panel_0.2.3_amd64.deb
apt install ./angie-panel_0.2.3_amd64.deb
cat /var/lib/angie-panel/setup-token
其他补全信息参考安装脚本 https://github.com/maxname/angie-panel/raw/refs/heads/main/packaging/install.sh
github编译版本发布页面https://github.com/maxname/angie-panel/releases
吃了几年再普乐 喜太乐 阿戈美拉汀,终于把精神状态拉回来了,也不胡思乱想了,
每天煮点山楂水调节肠胃不再受精神状态触发便秘,
晚上也能安稳睡觉了,
但每天的精力不再像10多年前那样能半夜接客户电话起来搞完事情第二还照旧生龙活虎的那样了。
Cisco Nexus 9000(N9K)跑的是 NX-OS,没有 IOS 那套 confreg / 配置寄存器机制。忘记 admin 密码时的官方恢复思路是:在启动阶段中断引导进入 loader,加载带 recoverymode 的内核进 switch(boot)# 模式,直接重置 admin 密码,再用 load-nxos 回到正常 NX-OS。
整个过程的优点很明确:不动 startup-config,业务配置原样保留。适合以下场景:
典型命令序列如下(后文逐条拆开讲):
loader> cmdline recoverymode=1
loader> dir bootflash:
loader> boot bootflash:nxos.9.3.5.bin
...
switch(boot)# configure terminal
switch(boot)(config)# admin-password Cisco@123
switch(boot)(config)# exit
switch(boot)# load-nxos
Console 连接(必须):N9K 的这条恢复流程只能走控制台,SSH/Telnet 用不上。N9K 控制台常见默认速率是 115200 bps(部分版本/固件为 9600),数据位 8、无校验、1 停止位、无流控。乱码就先切波特率,再检查别的问题。
能发送 Ctrl+C 的终端:PuTTY、SecureCRT、iTerm2 + screen /dev/tty.usbserial-XXXX 115200 都可以。
记录镜像文件名:如果还能登录,先记下 show version 里的 System image file 和 show boot 的输出,loader 阶段要用到确切文件名;不能登录也没关系,loader 里用 dir 自己看。
维护窗口:恢复过程要重启,承载业务的设备会中断流量;vPC 环境中确认对端健康(show vpc)后再动手。
密码方案提前想好:NX-OS 有密码强度检查,长度不足或字符类别太单一会被拒绝。
串口参数设置正确后,反复回车应能看到 N9K 的登录提示;此时别急着登录,直接进入下一步重启。
用电源开关、PDU、或拔插电源线给设备断电,重新上电。整个过程保持串口会话打开,准备随时按 Ctrl+C。
N9K 在开始自检后很快就会跳到内核引导,留给中断的窗口通常只有 1~3 秒。看到启动输出就连续敲 Ctrl+C,直到出现:
loader>
没进去就再断电重启一次。注意:N9K 不是用 Break 中断的,别拿 IOS 的习惯套上来。
loader> cmdline recoverymode=1
这条命令给内核加上恢复标记。它决定了设备启动后是进普通的登录界面,还是进不带鉴权的 switch(boot)#。漏掉这一步,后面 boot 完只会看到正常的 NX-OS 登录提示,恢复直接失败。
loader> dir bootflash:
部分版本也可以直接 loader> dir。输出里会列出 bootflash 下的镜像(例如 nxos.9.3.5.bin、n9000-dk9.9.3.5.bin)以及 packages.conf 一类的启动配置文件。把文件名原样记下来,写错会报 "cannot load" 或 file not found。
loader> boot bootflash:nxos.9.3.5.bin
有些版本要求路径带斜杠,即 boot bootflash:/nxos.9.3.5.bin;以 dir 的输出为准。如果这台交换机平时是通过 packages.conf 启动的,也可以 boot bootflash:packages.conf。
镜像加载完成后,系统会停在 boot 模式的提示符,通常长这样:
switch(boot)#
这个模式下没有配置校验,也没有正常启动的配置加载;它是恢复密码的唯一入口。
switch(boot)# configure terminal
switch(boot)(config)# admin-password Cisco@123
switch(boot)(config)# exit
switch(boot)# load-nxos
switch(boot)(config)#。网上流传的 switch(boot)(conft)# 是笔误,照着敲会报无效命令;configure terminal 建议写全,别用 conf t;admin-password 后面跟明文新密码,执行后 NX-OS 会把它以 hash 形式写进用户配置;switch(boot)# 下执行 admin-password <new-password>。如果 configure terminal 报错,可以试这个变体。switch(boot)# load-nxos
系统按 startup-config 正常启动(业务配置保留),启动完成后用 admin + 刚设置的新密码登录。登录后立刻保存一次:
n9k# show user-account
n9k# show running-config | include ^username admin
n9k# copy running-config startup-config
n9k# reload
Proceed with reload? [confirm]
重启后再次登录,确认新密码是持久的,而不是只存在于内存里。
n9k# show user-account:能看到 admin,角色为 network-admin;n9k# show running-config | include ^username:能看到 admin 一行(NX-OS 用 username admin password 5 <hash> role network-admin 的形式存储);n9k# copy running-config startup-config 之后,n9k# show startup-config | include ^username 应能看到同一行,说明已落盘;n9k# show boot:确认下次启动用的镜像/配置文件没有被 loader 阶段的临时指定改坏(loader 里的 cmdline recoverymode=1 只在本次启动有效,正常 load-nxos 后不需要额外清理,但值得核对一次);n9k# show vpc、n9k# show interface status:确认业务侧状态恢复正常。Ctrl+C,不是 Break。按 Break 不会有任何 loader 提示。cmdline recoverymode=1:最常见的失败原因。没有它,无论怎么 boot 都会走到正常登录界面,"恢复"无从下手。dir bootflash: 看清楚,注意 bootflash: 前缀和斜杠写法,版本不同容错不同。loader> 用 dir 重新确认文件名再 boot;确认镜像本身没有损坏(换另一个镜像试)。admin-password 被拒绝时,换一个更复杂的密码,而不是反复重试同一个。switch(boot)(conft)# 是错的,正确的是 switch(boot)(config)#。copy running-config startup-config:boot 模式里改的密码如果没落盘,下次重启可能又回到旧密码(具体取决于版本行为),登录后立刻保存是最稳的做法。aaa authentication login default group tacacs+ local 之类的策略,本地 admin 账号仍是 Console 兜底手段;但若 default 里只有远端组且本地被禁用,登录依旧会失败,需要检查 show running-config | include aaa 与 show aaa。write erase / no username admin 之类的清理动作,除非你确实要交付一台干净设备——那时顺序是 write erase → reload,并提前备份 copy running-config tftp:。show vpc 确认对端健康,操作期间关注对端日志。cmdline:极少数固件版本会报无效命令。这通常与镜像签名/安全启动策略相关,此时应走 Cisco TAC 的官方流程,不要尝试非常规手段。一句话总结:Console 接好 → 断电重启 → Ctrl+C 进 loader → cmdline recoverymode=1 → dir 找镜像 → boot bootflash:镜像 → switch(boot)# configure terminal → admin-password → load-nxos → 登录后 copy running-config startup-config 并重启复验。
转载自https://gitgit.ee/cisco-nexus-9000-password-reset.html
https://login.yahoo.com/myaccount/security
https://myaccount.google.com/apppasswords
添加app密码后就可以登录imap了
用了一段时间,发现angie的ns托管方式,签发ssl成功率并不太高,经常出现找不到TXT记录的问题。
注意:本文内容适用于 Tmux 2.3 及以上的版本,但是绝大部分的特性低版本也都适用,鼠标支持、VI 模式、插件管理在低版本可能会与本文不兼容。
启动新会话:
tmux [new -s 会话名 -n 窗口名]
恢复会话:
tmux at [-t 会话名]
列出所有会话:
tmux ls
tmux kill-session -t 会话名
tmux ls | grep : | cut -d. -f1 | awk '{print substr($1, 0, length($1)-1)}' | xargs kill
:new<回车> 启动新会话
s 列出所有会话
$ 重命名当前会话
c 创建新窗口
w 列出所有窗口
n 后一个窗口
p 前一个窗口
f 查找窗口
, 重命名当前窗口
& 关闭当前窗口
swap-window -s 3 -t 1 交换 3 号和 1 号窗口
swap-window -t 1 交换当前和 1 号窗口
move-window -t 1 移动当前窗口到 1 号
% 垂直分割
" 水平分割
o 交换窗格
x 关闭窗格
⍽ 左边这个符号代表空格键 - 切换布局
q 显示每个窗格是第几个,当数字出现的时候按数字几就选中第几个窗格
{ 与上一个窗格交换位置
} 与下一个窗格交换位置
z 切换窗格最大化/最小化
这么做可以切换到想要的窗口,输入 Tmux 前缀和一个冒号呼出命令提示行,然后输入:
:setw synchronize-panes
你可以指定开或关,否则重复执行命令会在两者间切换。 这个选项值针对某个窗口有效,不会影响别的会话和窗口。 完事儿之后再次执行命令来关闭。帮助
如果你不喜欢默认布局,可以重调窗格的尺寸。虽然这很容易实现,但一般不需要这么干。这几个命令用来调整窗格:
PREFIX : resize-pane -D 当前窗格向下扩大 1 格
PREFIX : resize-pane -U 当前窗格向上扩大 1 格
PREFIX : resize-pane -L 当前窗格向左扩大 1 格
PREFIX : resize-pane -R 当前窗格向右扩大 1 格
PREFIX : resize-pane -D 20 当前窗格向下扩大 20 格
PREFIX : resize-pane -t 2 -L 20 编号为 2 的窗格向左扩大 20 格
按下 PREFIX-[ 进入文本复制模式。可以使用方向键在屏幕中移动光标。默认情况下,方向键是启用的。在配置文件中启用 Vim 键盘布局来切换窗口、调整窗格大小。Tmux 也支持 Vi 模式。要是想启用 Vi 模式,只需要把下面这一行添加到 .tmux.conf 中:
setw -g mode-keys vi
启用这条配置后,就可以使用 h、j、k、l 来移动光标了。
想要退出文本复制模式的话,按下回车键就可以了。然后按下 PREFIX-] 粘贴刚才复制的文本。
一次移动一格效率低下,在 Vi 模式启用的情况下,可以辅助一些别的快捷键高效工作。
例如,可以使用 w 键逐词移动,使用 b 键逐词回退。使用 f 键加上任意字符跳转到当前行第一次出现该字符的位置,使用 F 键达到相反的效果。
vi emacs 功能
^ M-m 反缩进
Escape C-g 清除选定内容
Enter M-w 复制选定内容
j Down 光标下移
h Left 光标左移
l Right 光标右移
L 光标移到尾行
M M-r 光标移到中间行
H M-R 光标移到首行
k Up 光标上移
d C-u 删除整行
D C-k 删除到行末
$ C-e 移到行尾
: g 前往指定行
C-d M-Down 向下滚动半屏
C-u M-Up 向上滚动半屏
C-f Page down 下一页
w M-f 下一个词
p C-y 粘贴
C-b Page up 上一页
b M-b 上一个词
q Escape 退出
C-Down or J C-Down 向下翻
C-Up or K C-Up 向下翻
n n 继续搜索
? C-r 向前搜索
/ C-s 向后搜索
0 C-a 移到行首
Space C-Space 开始选中
C-t 字符调序
d 退出 tmux(tmux 仍在后台运行)
t 窗口中央显示一个数字时钟
? 列出所有快捷键
: 命令提示符
# 鼠标支持 - 设置为 on 来启用鼠标(与 2.1 之前的版本有区别,请自行查阅 man page)
* set -g mouse on
# 设置默认终端模式为 256color
set -g default-terminal "screen-256color"
# 启用活动警告
setw -g monitor-activity on
set -g visual-activity on
# 居中窗口列表
set -g status-justify centre
# 最大化/恢复窗格
unbind Up bind Up new-window -d -n tmp \; swap-pane -s tmp.1 \; select-window -t tmp
unbind Down
bind Down last-window \; swap-pane -s tmp.1 \; kill-window -t tmp
下面这份配置是我使用 Tmux 几年来逐渐精简后的配置,请自取。
# -----------------------------------------------------------------------------
# Tmux 基本配置 - 要求 Tmux >= 2.3
# 如果不想使用插件,只需要将此节的内容写入 ~/.tmux.conf 即可
# -----------------------------------------------------------------------------
# C-b 和 VIM 冲突,修改 Prefix 组合键为 Control-Z,按键距离近
set -g prefix C-z
set -g base-index 1 # 窗口编号从 1 开始计数
set -g display-panes-time 10000 # PREFIX-Q 显示编号的驻留时长,单位 ms
set -g mouse on # 开启鼠标
set -g pane-base-index 1 # 窗格编号从 1 开始计数
set -g renumber-windows on # 关掉某个窗口后,编号重排
setw -g allow-rename off # 禁止活动进程修改窗口名
setw -g automatic-rename off # 禁止自动命名新窗口
setw -g mode-keys vi # 进入复制模式的时候使用 vi 键位(默认是 EMACS)
# -----------------------------------------------------------------------------
# 使用插件 - via tpm
# 1. 执行 git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
# 2. 执行 bash ~/.tmux/plugins/tpm/bin/install_plugins
# -----------------------------------------------------------------------------
setenv -g TMUX_PLUGIN_MANAGER_PATH '~/.tmux/plugins'
# 推荐的插件(请去每个插件的仓库下读一读使用教程)
set -g @plugin 'seebi/tmux-colors-solarized'
set -g @plugin 'tmux-plugins/tmux-pain-control'
set -g @plugin 'tmux-plugins/tmux-prefix-highlight'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'tmux-plugins/tmux-yank'
set -g @plugin 'tmux-plugins/tpm'
# tmux-resurrect
set -g @resurrect-dir '~/.tmux/resurrect'
# tmux-prefix-highlight
set -g status-right '#{prefix_highlight} #H | %a %Y-%m-%d %H:%M'
set -g @prefix_highlight_show_copy_mode 'on'
set -g @prefix_highlight_copy_mode_attr 'fg=white,bg=blue'
# 初始化 TPM 插件管理器 (放在配置文件的最后)
run '~/.tmux/plugins/tpm/tpm'
# -----------------------------------------------------------------------------
# 结束
# -----------------------------------------------------------------------------
转载自:https://gist.github.com/ryerh/14b7c24dfd623ef8edc7
acme_client 99999_net https://acme-v02.api.letsencrypt.org/directory challenge=dns;
server {
listen unix:/run/acme-99999_net.sock;
server_name 99999.net *.99999.net;
acme 99999_net;
location @acme_hook_location {
acme_hook 99999_net uri=/angie.php;
proxy_pass http://API.SERVER;
proxy_read_timeout 560s;
proxy_send_timeout 560s;
proxy_set_header X-Acme-Hook $acme_hook_name;
proxy_set_header X-Acme-Challenge $acme_hook_challenge;
proxy_set_header X-Acme-Domain $acme_hook_domain;
proxy_set_header X-Acme-Keyauth $acme_hook_keyauth;
}
}
angie官方只写了fastcgi和php-fpm的配置,这里补全一下proxy_pass调用api的方式
示例参数说明:
99999.net是域名
99999_net是acme name (acme签发只签发ssl可以直接用域名,但是网站里面ssl_certificate维护的时候变量无法识别.必须用下划线_才能识别)
API.SERVER是接口服务器地址
uri=/angie.php是api接收具体uri地址
proxy_pass暂时只能走http, 走https会请求不到可能要用ngx_http_tunnel_module模块走tunnel_pass localhost:9000;
这里的server和 listen unix:/run/acme-99999_net.sock; 是http下的字段,用于专门管理acme,这里用server字段管理可以单独签证书, 也可以在 网站的server字段下加location字段 @acme_hook_location, 可以查看官方文档https://cn.angie.software/angie/docs/configuration/acme/#acme-config-hooks-minimal-configuration
X-Acme系列header是传送参数,这里用header方式,也可以走uri个get方式,但会造成明文泄露的问题.
acme_client 99999_net https://acme-v02.api.letsencrypt.org/directory challenge=dns;
server {
listen unix:/run/acme-99999_net.sock;
server_name 99999.net *.99999.net;
acme 99999_net;
}
upstream host_1 {
zone host_1 64k;
server 99.99.99.99:6680;
}
server {
listen 80;
server_name 99999.net *.99999.net;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen 443 quic;
http2 on;
http3 on;
server_name 99999.net *.99999.net;
status_zone host_1;
ssl_certificate $acme_cert_99999_net;
ssl_certificate_key $acme_cert_key_99999_net;
add_header Alt-Svc 'h3=":443"; ma=86400' always;
gzip on;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/rss+xml application/atom+xml image/svg+xml font/ttf font/otf application/vnd.ms-fontobject;
location / {
proxy_pass http://host_1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
}
}
最后,angie直接官方包直接支持js和lua安装后就能用,比原来的nginx和openresty更好用,具体更多细节查看官方文档https://cn.angie.software/angie/docs/installation/oss_packages/#oss-packages
另外域名太多的情况下可以考虑DCV域名指派方案(Domain Control Validation)。
年少轻狂的时候兜里掏不出富余的几百千来块钱,觉得几十百来万是小钱。
面对 现金流、税、房租、工资、社保、坏账、库存、设备、融资成本、折旧、养老、抚育、医疗、住房、婚嫁、人情世故各种问题后一个个都老实不语了;
之前那种不可一世不愿意总觉得和人有代沟的棱角也被磨平了,发现整个社会根本不会随便迁就自己, 也愿意主动迁就人了。
由于thinkphp只对Mysql有INSERT IGNORE方法,PostgreSQL是ON CONFLICT DO NOTHING方法,但是thinkphp orm一直没有支持,只能暂时在model用这个方法.
use think\facade\Db;
public static function insertIgnore(array $data, string $conflictTarget = null): int
{
$rawSql = static::fetchSql(true)->insert($data);
sql = "ON CONFLICT DO NOTHING";
if ($conflictTarget) {
$sql = "ON CONFLICT {$conflictTarget} DO NOTHING";
}
return Db::execute("{$rawSql} {$sql}");
}
前段时间看到老冯的公众号推送pgclone这玩意想搞来用一下 https://vonng.com/pg/pg-clone/
翻了下文档要求磁盘分区必须支持reflink才可以, 这就意味着ext4没法玩耍了, 必须XFS Btrfs ZFS分区格式才能玩.
apt install -y postgresql-common
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
install -d /usr/share/postgresql-common/pgdg
curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
apt update
apt install postgresql-18
USER="replica"
PASSWORD=$(openssl rand -base64 24)
NETWOKR="0.0.0.0/0" //从库IP段
IP="1.1.1.1" #主库IP
#主库
cat>>/etc/postgresql/18/main/postgresql.conf<<EOF
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
wal_keep_size = 1GB
archive_mode = off
#archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
EOF
#archive_mode归档模式很占空间
echo "host replication $USER $NETWOKR md5" >>/etc/postgresql/18/main/pg_hba.conf
# 创建用户(幂等)
sudo -u postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname='$USER'" | grep -q 1 || \
sudo -u postgres psql -c "CREATE ROLE $USER WITH REPLICATION LOGIN PASSWORD '$PASSWORD';"
systemctl restart postgresql
echo "REPL $USER PASSWORD: $PASSWORD"
echo -e "\n\n从库快速导入备份bash shell:"
echo -e "USER=$USER\nPASSWORD=$PASSWORD"
echo "sudo -u postgres pg_basebackup -h $IP -U $USER -D /home/postgresql/18/main -P -R -X stream -v"
IP="1.1.1.1" #主库IP
#rm -rf /var/lib/postgresql/18/main/*
cat>>/etc/postgresql/18/main/postgresql.conf<<EOF
listen_addresses = '*'
#recovery_min_apply_delay='24h' #延迟24小时同步
hot_standby = on
wal_keep_size = 2GB
max_wal_senders = 10
EOF
systemctl stop postgresql
mkdir /home/postgresql
chown -R postgres:postgres /home/postgresql
chmod 700 /home/postgresql
sudo -u postgres pg_basebackup -h $IP -U $USER -D /home/postgresql/18/main -P -R -X stream -v
cat /home/postgresql/18/main/postgresql.auto.conf >> /etc/postgresql/18/main/postgresql.conf
mv /home/postgresql/18/main/postgresql.auto.conf /home/postgresql/18/main/postgresql.auto.conf.bak
systemctl start postgresql
tail -n 100 /var/log/postgresql/postgresql-18-main.log
#验证主库 查看从库连接ip
sudo -u postgres psql -c "SELECT client_addr,state FROM pg_stat_replication;"
#验证从库 返回t
sudo -u postgres psql -c "SELECT pg_is_in_recovery();"
/etc/postgresql/18/main/conf.d/ 目录存放配置文件可以覆盖主配置
https://www.dnswatch.info/dns/dnslookup?la=en&host=164.210.103.in-addr.arpa&type=NS&submit=Resolve