TNT

讨论区

修改ssh默认端口,假设我们要将默认的22端口修改为22222

一,修改绑定的端口

1
2
3
sudo yum install policycoreutils
sudo semanage port -a -t ssh_port_t -p tcp 22222
sudo semanage port -m -t ssh_port_t -p tcp 22222
阅读全文 »

家里有台centos,由于没有公网ip或者公网ip一直在变,在外面访问的时候比较麻烦。
这里介绍frp的使用方式。

一,概述

1.1 工作场景

我的场景主要是在外网ssh到我家里的电脑

1
ssh user@公网ip -p指定端口

这样就可以直接连到我家里的电脑。
其中公网ip是我在阿里云买的便宜服务器。

1.2 工作模式

基本结构为:
家里电脑->公网服务器(提供ip)->办公室电脑
在公网服务器安装server
在家里电脑安装client
办公电脑只需要访问公网服务器即可访问到client

阅读全文 »

CentOS

升级gcc版本的正确方式:

1
2
3
4
5
sudo yum install centos-release-scl
sudo yum install devtoolset-9-gcc*
scl enable devtoolset-9 bash
which gcc
gcc --version

9是目标的gcc版本,可以改为你需要的。

阅读全文 »

本文主要介绍如何如何理解Java的四种引用.
这四种引用的文章已经很多了,但是大部分的文章都不太只管,本文提供了易理解的表达.

进程内存不足

如果JVM进程内存不足,将释放软引用的对象的内存以满足内存申请;

阅读全文 »

本文主要介绍如何优化ssh连接速度的问题。
总结:
a,修改服务器的sshd_config

1
2
GSSAPIAuthentication no
UseDNS no

b,增加熵
c,检查systemd-logind服务

1,GSSAPI的问题

1.1 查看日志

1
ssh -v root@myip

-v会输出连接的过程,我这边的示例:

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
OpenSSH_7.9p1 Debian-10+deb10u1, OpenSSL 1.1.1d  10 Sep 2019
debug1: Reading configuration data /home/thomas/.ssh/config
debug1: /home/thomas/.ssh/config line 78: Applying options for 192.168.1.11
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 192.168.1.11 [192.168.1.11] port 22.
debug1: Connection established.
debug1: identity file /home/thomas/.ssh/key1 type 0
debug1: identity file /home/thomas/.ssh/key1-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9p1 Debian-10+deb10u1
debug1: Remote protocol version 2.0, remote software version OpenSSH_8.0
debug1: match: OpenSSH_8.0 pat OpenSSH* compat 0x04000000
debug1: Authenticating to 192.168.1.11:22 as 'root'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:El+88pgfhRh9BnF2ReA+LY0PZdgy21L+YUsJoZtADwk
debug1: Host '192.168.1.11' is known and matches the ECDSA host key.
debug1: Found key in /home/thomas/.ssh/known_hosts:14
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: Will attempt key: /home/thomas/.ssh/key1 RSA SHA256:AsMxJh6bA76AOeVZxvL+cto3mwdO8c1M3qo5dZFnWDY explicit agent
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug1: SSH2_MSG_SERVICE_ACCEPT received

#看这里总共提到4种个方法,但是其实顺序是:gssapi-keyex->gssapi-with-mic->publickey->password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)

# 我是在这里卡了一会
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_1000)

1.2 解决-链接时不使用

在你链接时,主动绕过GSSAPI

1
ssh -o GSSAPIAuthentication=no root@myip

1.3 解决-服务端关闭

你需要在你的本机执行如下设置

1
vim /etc/ssh/sshd_config

找到GSSAPIAuthentication 设置为No,同时,主动设置UseDNS no

然后重启ssh服务即可

1
sudo systemctl restart sshd

1.4 什么是GSSAPI

此处参考

  1. GSSAPI:Generic Security Services Application Program Interface,GSSAPI本身是一套API,由IETF标准化。其最主要也是著名的实现是基于Kerberos的。一般说到GSSAPI都暗指Kerberos实现。

  2. UseDNS:是OpenSSH服务器上的一个DNS查找选项,而且默认还是打开的,在打开的状态下,每当客户端尝试连接OpenSSH服务器的时候,服务端就自动根据用户客户端的IP进行DNS PTR反向查询(IP反向解析才会有记录),查询出IP对应的Hostname,之后在根据客户端的Hostname进行DNS正向A记录查询。通过这个查询,验证IP是否和连接的客户端IP一致。但绝大部分我们的机器是动态获取IP的,也就是说,这个选项对于这种情况根本就没用——即使是普通静态IP服务器,只要没有做IP反向解析,也难以适用。如果你符合这些情况,建议关闭UseDNS以提高SSH远程登录时候的认证速度。

2,logind服务挂了

如果是卡在了这里

1
2
3
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.

那说明是systemd-logind服务挂了,可以systemctl status systemd-logind查看状态,或者直接重启这个服务:

1
systemctl restart systemd-logind

4,熵值过低的问题

ssh会用到各种加密算法,现在的各类加密工具对于随机数有很高的要求。
Linux的随机数生成器分为硬件生成器和软件生成器,硬件生成器会收集硬件设备的各种数据,相对难以预测;而软件生成器则会生成的比较慢。
当前由于大量的云服务器都是运行在虚拟机之上,硬件的变动难以收集,非常的‘安静‘,所以随机数的生成主要依赖软件。
通过如下命令查看当前的熵池:

1
cat /proc/sys/kernel/random/entropy_avail

一般都是在3000以上,如果你的没有达到这个值,可以通过一些常用的补充工具如rng-tools来生成。

1
2
3
sudo dnf install -y rng-tools
sudo systemctl start rngd
sudo systemctl enable rngd

再次查看熵值,基本熵都会大于3000了

5,内部dns问题

可能会卡在这里:

1
2
3
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<rsa-sha2-256,rsa-sha2-512>
debug1: SSH2_MSG_SERVICE_ACCEPT received

修改sshd配置文件,添加或者修改UseDNS no

本文主要介绍如何在通过docker部署Redis。
docker相关的初始化参见这里

一,安装

1.1 获取镜像

1
docker pull redis:latest

我这里命中的docker.io的源

docker run -d -it --restart=always -v /etc/localtime:/etc/localtime:ro -e TZ=Asia/Shanghai --name=redis_devops -p 16379:6379 docker.io/library/redis:6.2.6 /bin/sh -c 'redis-server --appendonly yes --requirepass 你的redis密码'
阅读全文 »

整体参考Linux相关服务器系统的环境初始化工作
源以及其他相关初始化脚本可以直接复用:

centos 7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl "https://mirrors.aliyun.com/repo/Centos-7.repo" -o /etc/yum.repos.d/CentOS-Base.repo 
curl "http://mirrors.aliyun.com/repo/epel-7.repo" -o /etc/yum.repos.d/epel.repo;

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache fast;
yum update -y;
yum upgrade -y;
yum install -y yum-config-manager;
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo;
yum install -y bind-utils centos-release-scl devtoolset-11-gcc* libsodium vim git java-11-openjdk-devel.x86_64 python3 centos-release-scl ntp ntpdate open-vm-tools yum-utils device-mapper-persistent-data lvm2 nginx-mod-stream qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer zlib-devel libffi-devel libuuid-devel readline-devel tk tk-devel ncurses-libs sqlite sqlite-devel bzip2-devel openssl-devel gdbm gdbm-devel libdbi-devel xz-devel python-backports-lzma mpdecimal expat libretls db4-devel libpcap-devel lzma xz perl-CPAN perl-IPC-Cmd gcc-c++ kernel-devel;
yum groupinstall -y 'Development Tools';
scl enable devtoolset-11 bash
ldconfig /usr/local/lib/
ldconfig /usr/local/lib64/
yum install -y docker-ce docker-ce-cli containerd.io;
mkdir -p /etc/docker;
ntpdate -u -s ntp1.aliyun.com ntp2.aliyun.com ntp2.aliyun.com

这里使用的是阿里云的镜像,可以参见阿里云的说明:https://developer.aliyun.com/mirror/
也推荐使用华为云的镜像:https://mirrors.huaweicloud.com/

本文主要介绍gpg key的生成和用法

一.概述

ssh用于身份鉴权,可push代码。
但是git的commit里,可以随意git config user.email,所以任何人都可以设置提交的邮箱,这里存在篡改的可能,github也确实出现过这类问题。
所以引入了gpg key,用于对commit进行签名。
如果你用了gpg key对commit进行签名,那么repor的提交记录里,你的信息会有个“已认证”"Verified"的样式,如下:
图片

你可能需要先安装gpg,mac通过Homebrew,再安装gpg:

1
brew install gpg
阅读全文 »

本文主要介绍如何更新centos 7 上的Nginx版本。

本文的安装整理自:这个网站


一,安装

1.1 更新系统

sudo yum makecache
sudo yum upgrade
sudo yum update
阅读全文 »

本文主要介绍如何在在Linux上部署Docker,主要步骤参见官网:
CentOS7:https://docs.docker.com/install/linux/docker-ce/centos/
CentOS8:https://www.linuxtechi.com/install-docker-ce-centos-8-rhel-8/
Ubuntu:https://docs.docker.com/engine/install/ubuntu/
阿里云:https://developer.aliyun.com/mirror/docker-ce,不过阿里云的教程里,有点问题

1. CentOS

1.1 配置Repo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
exclude=docker-ce docker-ce-cli containerd.io
EOF

/usr/bin/crb enable;setenforce 0;
dnf clean all;dnf makecache -y;dnf update -y;
dnf groupinstall -y 'development tools';
dnf install -y --disableexcludes=docker-ce-stable docker-ce docker-ce-cli containerd.io;
systemctl enable --now docker;
阅读全文 »

需要统计Gitlab上所有仓库、所有人的代码提交状况。
在网上找了找,发现基本上都是基于已经checkout到本地的统计,如果要统计服务器上所有仓库的,则没有现成的工具,所有我用Python写了一个。
放到GitHub上了:https://github.com/ccbuildpro/GitLabCommitStatics

一,核心思路

通过GitLab官方提供的API,基本可以得到如下流程:
获取所有Projects API->获取branch list->获取commit list->获取commit detail,再做汇总。

有几个注意点:
1,所有接口都需要access token
2,所有的列表接口,都是分页的

另外,这些接口都可以用postman来调一遍,或者直接在浏览器里访问

阅读全文 »

现在阿里云、腾讯云等各种云的服务器都比较便宜,以前搭建在github、coding.net等git pages上的站点,就想搭建在自己的服务器上了。

在腾讯云社区里找到一篇文章,在我的腾讯云的服务器上搭建成功。

我做了一些修改,输出到这里。

阅读全文 »

本书英文原版的名称是《Poor Economics: A Radical Rethinking of the Way to Fight Global Povert》,翻译过来大意应该是《穷人经济:与全球贫困作斗争的深度反思》,相对来说,它的中文译名《贫穷的本质:我们为什么摆脱不了贫穷》更准确的反映出了作者在文中所遇到的问题。

作者参与了全球很多地方的援助、救助、扶贫活动,同时也参考了其他组织做的各种有价值的活动所积累的宝贵数据和经验,再进行了深入的分析和不断的思考,得出了很多很有价值的观点。

作者认为一下两条中的任意一条均能够极大的促进贫穷状况的改善:

  • 家庭成员的良好的健康状况、受过良好的教育、对未来生活充满希望,将会极大的改善贫穷状况。
  • 政府制定相应的政策、且得到了有效的执行
阅读全文 »

写MarkDown的时候难免会有很多使用图片和视频的地方,分享下我的处理方式。

1.概述

媒体分类:静态图、动态图、视频
存储:云端对象存储

2.媒体格式

图片格式可以参考这位大神的移动端图片格式调研.

2.1.静态图

常见的jpg、png等比较大,像webp、heic、avif等都是比较优秀的格式。
webp,已经全平台支持了,推荐
heic,各个浏览器都不支持(截止2021-11-12),不能用。
avif,在chrome已经支持,基于chromium的或多或少在支持中,可根据你的实际情况使用。

2.2.动态图

目前常见格式是gif、webp、avif。
gif,体积较大,且清晰度低。
webp,动态图在清晰度和压缩率上都有不错的支持,推荐
avif,在chrome已经全面适配,而safari和移动端浏览器的支持还较差,基本不建议使用。

2.3.视频

首先应统一为mp4封装,至于编码格式,可以考虑h264、h265、vp8、vp9、av1。
h264的普适性最好,基本已经全平台支持。
vp8、vp9、av1在chrome平台支持性非常好,但是由于硬件的发展,av1相关的硬件编码器尚不普及,转换需要消耗较多的资源。
目前主要还是推荐h264、h265.
但是,如果作为你的个人blog,我建议还是不要放视频,最好直接将视频转为动图,优势如下:

  1. 信息密度高,利于阅读,对扬声器无依赖
  2. 体积小
  3. 转码快
    可以通过ffmpeg转换
1
2
3
4
5
# h265编码
ffmpeg -i ./VID_20210515_120714.mp4 -c:a copy -c:v libx265 -crf 33 ./output-h265-7.mp4
# av1编码
ffmpeg -i ./VID_20210515_120714.mp4 -c:a copy -c:v libaom-av1 -aom-params lossless=1 ./output-av1.mp4

3.存储

七牛(http://www.qiniu.com/) 或者阿里云、腾讯云的对象存储,稳定性和便利度都很高。
也都提供了大量的api方便脚本话使用。
可以参考我自己用的脚本:https://github.com/ccbuildpro/markdown_oss

4.媒体处理

4.1图片压缩

参考ImageMagick压缩图片

4.2.视频转换为动图

通过各种屏幕录制工具录制MP4,然后通过Gif Brewery将MP4转制为Gif,再压缩。
这里需要注意,使用Gif Brewery转为为Gif的时候,各种参数均需要设置为最高,这样可以保证ImageMagick判断重复帧,最大化提高压缩比。

4.3.视频转码

1
2
ffmpeg -i ./VID_20210515_120714.mp4 -c:a copy -c:v libx265 -crf 33 ./output-h265-7.mp4
ffmpeg -i ./VID_20210515_120714.mp4 -c:a copy -c:v libaom-av1 -aom-params lossless=1 ./output-av1.mp4

ffmpeg可以直接通过brew安装

1
brew install ffmpeg