一些命令

With LLM

划分并开启 Swap

  1. 检查当前的 Swap 状态:
    使用以下命令查看当前系统的 Swap 使用情况:
swapon --show
  1. 创建 Swap 文件
  • 创建一个 Swap 文件,例如 2GB 大小的文件:
fallocate -l 2G /swapfile

或者

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
  • 设置文件的权限和格式:
chmod 600 /swapfile
mkswap /swapfile
  1. 启用 Swap 文件
swapon /swapfile 
  1. 持久配置 Swap

修改 /etc/fstab,添加 /swapfile none swap sw 0 0 以自动启用 Swap 文件。

如果是创建了 Swap 分区,则更改为添加 UUID=<swap_partition_uuid> none swap sw 0 0

  1. 调整调度策略(Swappiness)(可选)

Swappiness 值决定系统在何时将内存中的数据交换到 Swap 区域。默认情况下,Ubuntu 和 Debian 的 Swappiness 值通常为 60。可以根据需要调整这个值。编辑 /etc/sysctl.conf,添加或修改 vm.swappiness=10 (例如,设置为 1010)。保存文件后 sudo sysctl -p 使其生效。

  1. 重启系统
sudo reboot

apt

apt install <包名(去掉尖括号)>
apt list --installed
apt remove <包名>
# 移除配置及其依赖
apt purge <包名>

firewall

配置防火墙:

  • 使用UFW:
sudo ufw allow 14310/udp
sudo ufw enable
sudo ufw status
  • 使用iptables:
sudo iptables -A INPUT -p udp --dport 14310 -j ACCEPT
sudo iptables-save

本地化环境

1. 安装并生成UTF-8本地化环境

sudo apt-get update
sudo apt-get install locales
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

也可以

sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales

进入交互式页面时,空格选中,回车确认

2. 确认本地化设置

执行以下命令,确认本地化设置是否正确:

locale

确保输出中包含如下内容:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

3. 更新 locale 设置

实际上刚刚执行过的命令已经写入了文件,但我测试时并没有成功,于是进行这一步

确保系统的 locale 配置文件已更新,编辑 /etc/default/locale 文件并确保内容如下:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=en_US.UTF-8
LC_ALL=en_US.UTF-8

4. 重启服务器(如有必要)

有时更改本地化设置后需要重启服务器以使其生效:

sudo reboot

Mosh

相比 SSH,Mosh

  • 优点:更适合延迟较高,网络不稳定的场合。断线重连时不会丢掉正在运行的进程。
  • 缺点:只能浏览当前屏幕内容,滚动需要配合 less

远程参数

似乎并不用在 server 手动执行,安装好 mosh 即可。本地化参数根据设备以及需求选择。

mosh-server new -p 14310 -s -l LANG=en_US.UTF-8

本地参数

我的 ssh server 端口监听在 6413164131,更多的情况是 2222。让 mosh 信息传输在 1431014310 端口,用如下参数

不要忘记放行端口

mosh --port=14310 <username>@<ip> --ssh="ssh -p 64131"

用完记得 exit,不然下次链接会显示端口占用之类的报错。那时就需要用别的方法连到机器,kill 掉才能再次通过同样的端口连接

Systemd

systemd 是一个系统和服务管理器,广泛应用于许多 Linux 发行版中,负责启动和管理系统服务和资源。它通过单一的框架提供了很多系统级功能,如启动服务、管理挂载点、设备、套接字等。

基本概念

  1. Unit(单元)systemd 使用“单元”来表示系统资源和服务。每个单元都具有特定的类型,如服务(service)、挂载点(mount)、设备(device)等。常见的单元类型包括:

    • .service:服务单元,如网络服务器、数据库服务。
    • .socket:套接字单元,用于网络或 IPC 套接字。
    • .target:目标单元,用于逻辑分组其他单元,类似于运行级别。
    • .timer:定时器单元,用于代替 cron 任务。
  2. Unit 文件:定义单元行为的配置文件,通常位于 /etc/systemd/system//lib/systemd/system/

  3. 服务管理命令:管理 systemd 单元的命令工具,如 systemctljournalctl

常用命令

管理服务

  • 启动服务

    sudo systemctl start <service_name>
    
  • 停止服务

    sudo systemctl stop <service_name>
    
  • 重启服务

    sudo systemctl restart <service_name>
    
  • 重新加载服务配置(如果服务支持):

    sudo systemctl reload <service_name>
    
  • 启用服务开机启动

    sudo systemctl enable <service_name>
    
  • 禁用服务开机启动

    sudo systemctl disable <service_name>
    
  • 查看服务状态

    systemctl status <service_name>
    

查看系统日志

  • 查看所有日志

    journalctl
    
  • 查看特定服务的日志

    journalctl -u <service_name>
    
  • 实时查看日志

    journalctl -f
    

创建和管理自定义服务

创建服务单元文件

假设你有一个脚本 my_script.sh 想在系统启动时运行,你可以创建一个服务单元文件来管理这个脚本。

  1. 编写服务文件
    创建文件 /etc/systemd/system/my_script.service,内容如下:

    [Unit]
    Description=My Custom Script Service
    After=network.target
    
    [Service]
    ExecStart=/path/to/my_script.sh
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
  2. 说明

    • [Unit]:描述单元及其依赖关系。After=network.target 确保网络服务在该服务之前启动。
    • [Service]:定义服务的执行行为。ExecStart 指定启动服务的命令,Restart=on-failure 表示在服务失败时自动重启。
    • [Install]:定义服务安装时的行为。WantedBy=multi-user.target 指定服务在哪个目标下启动。
  3. 重新加载 systemd 配置

    sudo systemctl daemon-reload
    
  4. 启动并启用服务

    sudo systemctl start my_script.service
    sudo systemctl enable my_script.service
    

systemd 提供了强大的系统管理能力,理解和掌握 systemd 可以帮助你更好地管理 Linux 系统服务和资源。

SSH

ssh-keygen -t ed25519 -C "k@k.com" -f /Users/key/id_25519

在这个命令中:

  • -t ed25519 指定了生成的密钥类型为ED25519。
  • -C "k@k.com" 添加了一个注释,用于标识密钥。
  • -f /Users/key/id_25519 指定了密钥文件的保存路径和文件名。

确保指定的路径是有效的且你有写入权限。如果指定的路径或目录不存在,需要先创建相关的目录。

在生成SSH密钥时,ssh-keygen会提示你输入一个密码短语(passphrase)。这是对私钥的加密保护,提供额外的安全层。如果私钥文件落入他人之手,没有密码短语的人仍然无法使用它。

以下是密码短语的相关说明和选项:

  1. 输入密码短语:输入一个强密码短语,为你的私钥增加保护。如果你选择使用密码短语,每次使用私钥时都需要输入此密码。

  2. 留空(不使用密码短语):直接按回车键跳过密码短语设置。这意味着私钥文件没有额外的加密保护,使用时不需要输入密码。尽管这使得使用私钥更加方便,但也意味着私钥如果被盗取,任何人都可以使用它。

  3. 密码短语建议:如果选择设置密码短语,建议使用一个强且难以猜测的短语,包含大小写字母、数字和特殊字符,并且长度应足够长。

最终选择取决于你的安全需求和平衡便捷性。对于较高的安全需求,建议设置一个强密码短语。

SSH密钥生成过程中的随机艺术图像(randomart image)是一种用来人类可读形式展示密钥指纹的方法。它由密钥的指纹生成,是密钥的一个视觉表示,通常用于检查或验证密钥的完整性。

随机艺术图像的作用

  1. 可视化检查:当用户多次连接到同一服务器时,他们可以比较这些图像来验证连接的密钥是否一致。这是一种简单的视觉验证方法。
  2. 防止钓鱼攻击:它可以帮助用户检测到中间人攻击(MITM),即攻击者伪装成服务器的情况,因为随机艺术图像会因密钥不同而不同。

泄露的影响

泄露随机艺术图像本身通常不会直接带来安全风险,因为它是从密钥指纹派生而来的,而不是密钥本身。以下是需要注意的几点:

  1. 不暴露私钥:随机艺术图像并不暴露你的私钥或公钥内容。因此,单独的随机艺术图像不会给恶意用户提供访问权限。

  2. 安全实践:尽管如此,保持这些图像的私密性是一个良好的安全实践,尤其是在敏感环境中。虽然它们的泄露不会直接导致密钥被破解,但保持安全信息的私密性总是值得的。

  3. 与密钥指纹的关联:如果攻击者能够获取到密钥指纹并进一步关联到某个特定的密钥,那么在某些情况下,这些信息可能被用于尝试破解或进行其他恶意行为。不过,这种情况需要攻击者获取其他敏感信息,单独的随机艺术图像通常不具备这样的风险。

综上所述,随机艺术图像的泄露一般不会带来严重的安全风险,但保持这些信息的私密性仍是良好的做法,特别是在涉及高安全要求的环境中。

在生成SSH密钥对后,接下来你需要将生成的公钥复制到你希望通过SSH访问的服务器上,以便启用无密码登录。以下是详细的步骤:

1. 将公钥添加到服务器

将生成的公钥添加到目标服务器的~/.ssh/authorized_keys文件中。如果服务器上没有这个文件或目录,可以手动创建。

使用ssh-copy-id(推荐)

ssh-copy-id命令是一个便捷的工具,可以将本地公钥复制到远程服务器的authorized_keys文件中。确保已经成功生成密钥对后,执行以下命令:

ssh-copy-id -i /path/to/your/id_ed25519 user@remote_server_ip

这里:

  • /path/to/your/id_ed25519 是你的公钥文件路径,通常是 ~/.ssh/id_ed25519.pub
  • user 是你在远程服务器上的用户名。
  • remote_server_ip 是远程服务器的IP地址。

手动复制公钥

如果无法使用ssh-copy-id,可以手动复制公钥:

  1. 查看本地公钥的内容

    cat ~/.ssh/id_ed25519.pub
    
  2. 登录到远程服务器

    你需要使用原有的密码登录到服务器。

  3. 创建.ssh目录和authorized_keys文件

    mkdir -p ~/.ssh
    echo "your_public_key_content" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    

    将之前复制的公钥内容替换为your_public_key_content,确保授权文件的权限正确设置。

1. 验证无密码登录

使用生成的私钥文件尝试连接到远程服务器,确保无密码登录工作正常:

ssh -i /path/to/your/id_25519 -p 22 user@remote_server_ip

这里需要替换:

  • /path/to/your/id_25519 为你的私钥文件路径。
  • user 为远程服务器上的用户名。
  • remote_server_ip 为远程服务器的IP地址。

2. 检查已添加的密钥

连接到远程服务器后,你可以检查~/.ssh/authorized_keys文件,以确保只有预期的公钥存在:

cat ~/.ssh/authorized_keys

确认文件中只有你添加的公钥,没有其他未知或不必要的密钥。

3. 禁用密码登录(可选)

如果你确认可以通过SSH密钥成功登录,可以考虑禁用密码登录以提高安全性:

  1. 编辑SSH配置文件

    在远程服务器上,使用文本编辑器打开/etc/ssh/sshd_config文件:

    sudo nano /etc/ssh/sshd_config
    
  2. 禁用密码认证

    找到或添加以下配置,并确保它们的值为no

    PasswordAuthentication no
    ChallengeResponseAuthentication no
    

    公钥登录为 yes

    PubkeyAuthentication yes
    
  3. 重启SSH服务

    保存配置文件并重启SSH服务以应用更改:

    sudo systemctl restart sshd
    

这些步骤将确保只有拥有正确SSH密钥的用户能够访问服务器,进一步提高系统的安全性。在禁用密码登录之前,务必确保SSH密钥登录功能正常,以避免被锁定在系统之外。

CMD parameter

ps
ps w
ps aux

如果上面的命令都没有的话,尝试

for pid in $(ls /proc/ | grep '^[0-9]'); do
    echo "PID: $pid"
    cat /proc/$pid/cmdline
    echo
done

Docker

uname -a # 熟悉环境
docker ps -a # 全部容器
docker ps # 正在运行的容器
curl 127.0.0.1 # 测试本地连接
docker logs 7d541f2d7758 # 目标容器日志
docker logs 8b853f494378 # 数据库日志
less ~/.bash_history # 历史记录
docker network ls # 列出 Docker 网络
docker network inspect bridge # Docker 查看指定网络名详情
docker inspect --format='{{.NetworkSettings.Networks}}' mysql # 查询容器所属的网络
docker inspect --format='{{.NetworkSettings.Networks}}' typecho
echo $SHELL # 查看当前 shell
cat /etc/shells # 查看配置的所有 shell
curl 127.1 # 测试连接, 查看报错
docker logs mysql
docker inspect mysql | grep MYSQL
mysql
uname -a
sudo apt update
lsb_release -a
yum install mysql
mysql # 测试 MySQL
mysql -h 127.0.0.1 -P 10812 -u root -p
mysql --version
yum remove mariadb # 版本太旧, 验证失败, 卸载
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install mysql-community-client
yum search mysql-community
yum install mysql-community-client.x86_64
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
yum install mysql-community-client.x86_64
mysql
mysql -h 127.0.0.1 -P 10812 -u root -p
sudo find / -type f -name "config.inc.php" # 更有意义的是去
cd /srv/http/typecho/
ls
docker exec -it typecho bash # bash 不存在
docker exec -it typecho sh # 进入 shell 后修改 typecho 配置
docker inspect --format='{{.NetworkSettings.Networks}}' mysql
docker inspect --format='{{.NetworkSettings.Networks}}' typecho
docker network inspect bridge # 查看配置
docker exec -it typecho ping mysql # 测试连接
docker restart typecho # 重启指定的 Docker container
curl 127.0.0.1 # 测试连接
exit

Go

使用 go get (Go 1.17 及以上)来管理模块的依赖,必须在一个 Go 模块中运行该命令。

1. 初始化 Go 模块

需要在一个 Go 模块内运行 go get。这意味着需要先初始化一个 Go 模块。下面是初始化 Go 模块的步骤:

  1. 创建一个新目录并进入该目录

    mkdir myproject
    cd myproject
    
  2. 初始化 Go 模块

    go mod init myproject
    

    这会创建一个 go.mod 文件。

  3. 使用 go get 获取依赖

    go get -u github.com/refraction-networking/utls
    

    这会将 utls 包添加到 go.mod 文件中,并下载其依赖。

2. 使用 go install 安装命令

如果希望安装一个 Go 程序而不是添加一个模块依赖,可以使用 go install 命令。比如,如果 github.com/refraction-networking/utls 包有一个可执行程序,可以通过以下命令安装:

go install github.com/refraction-networking/utls@latest

示例步骤

假设要使用 github.com/refraction-networking/utls 包,以下是完整的操作步骤:

  1. 创建并初始化项目

    mkdir myproject
    cd myproject
    go mod init myproject
    
  2. 添加依赖

    go get -u github.com/refraction-networking/utls
    
  3. 编写代码

    创建一个 main.go 文件:

    package main
    
    import (
        "fmt"
        "github.com/refraction-networking/utls"
    )
    
    func main() {
        fmt.Println("Hello, utls!")
    }
    
  4. 运行程序

    go run main.go