一些命令
With LLM
划分并开启 Swap
- 检查当前的 Swap 状态:
使用以下命令查看当前系统的 Swap 使用情况:
swapon --show
- 创建 Swap 文件
- 创建一个 Swap 文件,例如 2GB 大小的文件:
fallocate -l 2G /swapfile
或者
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
- 设置文件的权限和格式:
chmod 600 /swapfile
mkswap /swapfile
- 启用 Swap 文件
swapon /swapfile
- 持久配置 Swap
修改 /etc/fstab
,添加 /swapfile none swap sw 0 0
以自动启用 Swap 文件。
如果是创建了 Swap 分区,则更改为添加 UUID=<swap_partition_uuid> none swap sw 0 0
- 调整调度策略(Swappiness)(可选)
Swappiness 值决定系统在何时将内存中的数据交换到 Swap 区域。默认情况下,Ubuntu 和 Debian 的 Swappiness 值通常为 60。可以根据需要调整这个值。编辑 /etc/sysctl.conf
,添加或修改 vm.swappiness=10
(例如,设置为 )。保存文件后 sudo sysctl -p
使其生效。
- 重启系统
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 端口监听在 ,更多的情况是 。让 mosh 信息传输在 端口,用如下参数
不要忘记放行端口
mosh --port=14310 <username>@<ip> --ssh="ssh -p 64131"
用完记得 exit,不然下次链接会显示端口占用之类的报错。那时就需要用别的方法连到机器,kill 掉才能再次通过同样的端口连接
Systemd
systemd
是一个系统和服务管理器,广泛应用于许多 Linux 发行版中,负责启动和管理系统服务和资源。它通过单一的框架提供了很多系统级功能,如启动服务、管理挂载点、设备、套接字等。
基本概念
-
Unit(单元):
systemd
使用“单元”来表示系统资源和服务。每个单元都具有特定的类型,如服务(service
)、挂载点(mount
)、设备(device
)等。常见的单元类型包括:.service
:服务单元,如网络服务器、数据库服务。.socket
:套接字单元,用于网络或 IPC 套接字。.target
:目标单元,用于逻辑分组其他单元,类似于运行级别。.timer
:定时器单元,用于代替 cron 任务。
-
Unit 文件:定义单元行为的配置文件,通常位于
/etc/systemd/system/
或/lib/systemd/system/
。 -
服务管理命令:管理
systemd
单元的命令工具,如systemctl
、journalctl
。
常用命令
管理服务
-
启动服务:
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
想在系统启动时运行,你可以创建一个服务单元文件来管理这个脚本。
-
编写服务文件:
创建文件/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
-
说明:
[Unit]
:描述单元及其依赖关系。After=network.target
确保网络服务在该服务之前启动。[Service]
:定义服务的执行行为。ExecStart
指定启动服务的命令,Restart=on-failure
表示在服务失败时自动重启。[Install]
:定义服务安装时的行为。WantedBy=multi-user.target
指定服务在哪个目标下启动。
-
重新加载
systemd
配置:sudo systemctl daemon-reload
-
启动并启用服务:
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)。这是对私钥的加密保护,提供额外的安全层。如果私钥文件落入他人之手,没有密码短语的人仍然无法使用它。
以下是密码短语的相关说明和选项:
-
输入密码短语:输入一个强密码短语,为你的私钥增加保护。如果你选择使用密码短语,每次使用私钥时都需要输入此密码。
-
留空(不使用密码短语):直接按回车键跳过密码短语设置。这意味着私钥文件没有额外的加密保护,使用时不需要输入密码。尽管这使得使用私钥更加方便,但也意味着私钥如果被盗取,任何人都可以使用它。
-
密码短语建议:如果选择设置密码短语,建议使用一个强且难以猜测的短语,包含大小写字母、数字和特殊字符,并且长度应足够长。
最终选择取决于你的安全需求和平衡便捷性。对于较高的安全需求,建议设置一个强密码短语。
SSH密钥生成过程中的随机艺术图像(randomart image)是一种用来人类可读形式展示密钥指纹的方法。它由密钥的指纹生成,是密钥的一个视觉表示,通常用于检查或验证密钥的完整性。
随机艺术图像的作用
- 可视化检查:当用户多次连接到同一服务器时,他们可以比较这些图像来验证连接的密钥是否一致。这是一种简单的视觉验证方法。
- 防止钓鱼攻击:它可以帮助用户检测到中间人攻击(MITM),即攻击者伪装成服务器的情况,因为随机艺术图像会因密钥不同而不同。
泄露的影响
泄露随机艺术图像本身通常不会直接带来安全风险,因为它是从密钥指纹派生而来的,而不是密钥本身。以下是需要注意的几点:
-
不暴露私钥:随机艺术图像并不暴露你的私钥或公钥内容。因此,单独的随机艺术图像不会给恶意用户提供访问权限。
-
安全实践:尽管如此,保持这些图像的私密性是一个良好的安全实践,尤其是在敏感环境中。虽然它们的泄露不会直接导致密钥被破解,但保持安全信息的私密性总是值得的。
-
与密钥指纹的关联:如果攻击者能够获取到密钥指纹并进一步关联到某个特定的密钥,那么在某些情况下,这些信息可能被用于尝试破解或进行其他恶意行为。不过,这种情况需要攻击者获取其他敏感信息,单独的随机艺术图像通常不具备这样的风险。
综上所述,随机艺术图像的泄露一般不会带来严重的安全风险,但保持这些信息的私密性仍是良好的做法,特别是在涉及高安全要求的环境中。
在生成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
,可以手动复制公钥:
-
查看本地公钥的内容:
cat ~/.ssh/id_ed25519.pub
-
登录到远程服务器:
你需要使用原有的密码登录到服务器。
-
创建
.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密钥成功登录,可以考虑禁用密码登录以提高安全性:
-
编辑SSH配置文件:
在远程服务器上,使用文本编辑器打开
/etc/ssh/sshd_config
文件:sudo nano /etc/ssh/sshd_config
-
禁用密码认证:
找到或添加以下配置,并确保它们的值为
no
:PasswordAuthentication no ChallengeResponseAuthentication no
公钥登录为 yes
PubkeyAuthentication yes
-
重启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 模块的步骤:
-
创建一个新目录并进入该目录
mkdir myproject cd myproject
-
初始化 Go 模块
go mod init myproject
这会创建一个
go.mod
文件。 -
使用
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
包,以下是完整的操作步骤:
-
创建并初始化项目
mkdir myproject cd myproject go mod init myproject
-
添加依赖
go get -u github.com/refraction-networking/utls
-
编写代码
创建一个
main.go
文件:package main import ( "fmt" "github.com/refraction-networking/utls" ) func main() { fmt.Println("Hello, utls!") }
-
运行程序
go run main.go
- 划分并开启 Swap
- apt
- firewall
- 本地化环境
* - Mosh
- Systemd
* - SSH
* - CMD parameter
- Docker
- Go
*