Study hard and make progress every day!

2022-09-09
Bash Completion命令自动补全提示功能

使用bash-completion来实现bash下命令的自动补全功能。该组件在Github上的地址: https://github.com/scop/bash-completion#installation

安装方法

CentOS 7下:

1
sudo yum install bash-completion

Ubuntu下:

1
sudo apt install bash-completion

安装后退出当前shell重新登录即可获取补全功能。

相关文件

启动文件

CentOS 7下为例。安装了bash-completion后,将会在/etc/profile.d目录下添加文件bash_completion.sh,用于启动bash时候自动添加补全功能。
如果没有自动添加,也可以自己添加,在~/.bashrc中添加

1
source /usr/share/bash-completion/bash_completion

各命令补全脚本

各命令补全的脚本存放在/usr/share/bash-completion/completions/目录中。
比如通过yum安装docker后,安装程序会在上述补全脚本目录下添加一个名为docker的文件,就是对应docker命令的补全脚本。

关于命令补全脚本的编写示例,可以参考Bash命令自动补全的原理

阅读此文

2022-08-28
Firewalld防火墙开启masquerade后lookback服务访问问题

问题描述

按照CentOS7 下搭建简易的L2TP/IPSec 服务搭建好L2TP/IPSec服务后,发现一个问题。
该入口机器上还跑着一些测试服务,有些测试服务是绑定的本机的loopback接口的,只对本机提供服务的。

本机上有一些另外的java服务,使用localhost地址访问这些服务时,发现请求会被解析为使用机器的外网地址来访问这些内网服务,导致java服务出错。
没法一眼看出问题,因此只能通过逐步停到服务的方式,来查看到底是当时搭建L2TP/IPSec的过程中,哪个设置导致了这个问题。

问题调查

依次停掉ipsec,xl2tpd服务,问题依然存在。
移除firewalld的masquerade设置后,java访问的问题就好了。

问题解决

感觉是localhost的loopback接口被配置了masquerade导致的问题,便想着有没有什么办法可以将loopback排除在masquerade配置以外,网上一通搜索,找到了一些类似问题,但似乎没有正确的解决办法。

阅读此文

2022-08-24
CentOS7 下搭建简易的L2TP/IPSec 服务

在CentOS 7上搭建L2TP/IPSec服务,用来在外时也能访问内网Git服务器。
搭建方法有很多现成的脚本。

因为只需要设置一个简单的VPN, 查看了下teddysun/across的l2tp.sh比较方便,因此选用了该方法。
在此将脚本中有关CentOS 7的步骤罗列解析一下。方便后续有配置要改动的时候做到心中有数。

脚本化安装

脚本化安装步骤如下:

基础信息

脚本: https://github.com/teddysun/across/blob/master/l2tp.sh
安装环境: VMWare下的虚拟机上的CentOS 7
系统局域网IP: 192.168.172.193, 也是我们VPN的接入IP

阅读此文

2022-07-20
ElementUI表格使用资料参考

Element UI Table表格的使用方法的资料摘录:

一个Table使用例子的参考: element-ui table多选CheckBox参数解析

阅读此文

2022-07-12
CVE-2021-4034本地提权漏洞

漏洞介绍

2022年1月25日 qualys披露 CVE-2021-4034 polkit pkexec 本地提权漏洞。polkit pkexec 中对命令行参数处理有误,导致参数注入,能够导致本地提权。
漏洞详情:https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034

漏洞修复

可升级修复包时

CentOS 7 下执行yum update polkit
Alibaba Cloud Linux可执行yum update polkit
Ubuntu 18.04 LTS、Ubuntu 20.04 LTS的用户可通过apt update policykit-1升级修复
Amazon Linux 2下执行yum update polkit

不能升级修复包时

无法升级软件修复包的,可使用以下命令删除pkexec的SUID-bit权限来规避漏洞风险:

1
chmod 0755 /usr/bin/pkexec

PoC

Poc地址: arthepsy/CVE-2021-4034

Reference

阅读此文

2022-07-05
Amazon Linux2中如何生成和使用Let's Encrypt的证书

在Amazon Linux中使用certbot来创建Let’s Encrypt的证书,步骤如下:

安装certbot

1
2
sudo amazon-linux-extras install epel
sudo yum install certbot python-certbot-nginx

设置certbot生成证书

1
sudo certbot certonly -d *.examplexxx.com --manual --preferred-challenges dns

其中:

  • certonly: 指只生成证书而不部署
  • -d *.examplexxx.com: 指需要生成的是examplexxx.com的通配域名
  • --manual: 指指定交互方式
  • --preferred-challenges dns: 指使用dns方式验证,(泛域名/通配域名只能通过此方式进行)
阅读此文

2022-04-25
alternatives命令简单用法

alternatives/update-alternatives的用法

alternatives(update-alternatives)命令用于处理 Linux 系统中软件版本的切换,使其多版本共存。alternatives 的管理目录 /etc/alternatives 。

用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# alternatives --help
alternatives(备用)版本 1.7.4 - 版权 (C) 2001 红帽公司
在 GNU 公共许可条款下,本软件可被自由地重发行。
用法:alternatives --install <链接> <名称> <路径> <优先度>
[--initscript <服务>]
[--family <family>]
[--slave <链接> <名称> <路径>]*
alternatives --remove <名称> <路径>
alternatives --auto <名称>
alternatives --config <名称>
alternatives --display <名称>
alternatives --set <名称> <路径>
alternatives --list
common options: --verbose --test --help --usage --version --keep-missing
--altdir <目录> --admindir <目录>
#

举例说明

以CentOS 7下java命令为例说明alternatives的用法

环境说明

最小化安装CentOS 7.6, 安装java 8 和java 11

1
2
sudo yum install java-11-openjdk-devel
sudo yum install java-1.8.0-openjdk-devel

阅读此文

2022-04-24
CentOS 7中手动注册服务到systemctl

本文以一个简单的java应用举例,介绍下如何将应用手动添加到systemctl中作为一个server启动。
目的:

  1. 将应用以service的形式注册进systemctl
  2. 使用普通用户启动该service
  3. 赋予普通用户启动/停止/重启该service的权限

前期准备

  • 建立deployer用户

    1
    sudo useradd deployer
  • 建立服务运行目录

    1
    2
    sudo mkdir -p /opt/java/
    sudo chown -R deployer:deployer /opt/java/
  • 将java代码拷贝如/opt/java/目录中,名为Main.jar

阅读此文

2022-02-07
如何在Macos下配置ssh管理多个github账号

介绍在MacOS上管理两个Github账号的ssh key的方法,主要操作就是在ssh的配置文件~/.ssh/config中指定两个不同的Host。

前提介绍

两个github账号,分别为carl.shen和jibing57,对应使用的key如下:

  • carl.shen: id_rsa_carl_github_key
  • jibing57: id_rsa_github

其中,carl.shen是默认账号,jibing57是第二账号。

ssh 配置

两个账号,在~/.ssh/config配置文件中对应的配置如下:

1
2
3
4
5
6
7
8
9
Host "github.com"
HostName "github.com"
User "carl.shen"
IdentityFile ~/.ssh/id_rsa_carl_github_key
Host "jibing57.github.com"
HostName "github.com"
User "jibing57"
IdentityFile ~/.ssh/id_rsa_github

关键点就在于Host "jibing57.github.com"这一几个配置。
该设置的意思是: 当访问Host是jibing57.github.com, 需要使用key ~/.ssh/id_rsa_github来访问,但访问jibing57.github.com时,实际映射到的还是github.com
通过使用Host别名来实现不同的key同时访问github.com

阅读此文

2022-01-07
使用pg_repack回收PostgreSQL磁盘空间

pg_repack介绍

PostgreSQL数据库,因为multiversion concurrency control (MVCC)的原因,在update和delete的事务处理中需要将老数据另行保存一份,会导致占用的磁盘空间会比实际有效空间要大很多。

PostgreSQL自带了autovacuum和vacuum命令, 可以检测这部分旧数据,标记这部分空间为可用,供后续使用,一定程度上可以缓解存储空间肿胀(bloat)的问题,但问题在于autovacuum和vacuum只是在PG范围内标记空间为可用,并不会将空间释放给操作系统进行重新利用。
如果需要将空间释放和操作系统使用,需要使用vacuum full命令,但是该命令会使用排它锁,堵塞对应表的读写操作。在生产环境中是不推荐使用的。

pg_repack这个插件,可以在不阻塞表读写的情况下,进行表数据的清理。
作用机理是:创建一个新表,将数据从旧表移动到新表。为了避免表被独占锁定,创建了一个额外的日志表来记录原始表的改动,还添加了一个把INSERT / UPDATE / DELETE操作记录到日志表的触发器。当原始表中的数据全部导入到新表中,索引重建完毕,日志表的改动全部完成,pg_repack会连同新索引,用新表替换旧表,并将原旧表Drop掉。整个过程非常简单,非常可靠,但是需要注意的是——需要额外剩余足够的磁盘空间(原表大小 + 索引 + 额外的日志表空间)

实操

下面记录一次使用pg_repack来回收AWS RDS for PostgreSQL中磁盘空间的过程。

准备工作

查看RDS的数据库版本和支持的pg_repack版本。

查看数据库版本为PG 10.18

1
2
3
4
5
6
7
ebdb=> select version();
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 10.18 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit
(1 row)
ebdb=>

阅读此文