运维笔记 ongoing
文档用途
在 Linux 服务器上操作时, 会遇到一些不常用操作, 容易忘.
因此专门开一个文档, 用于记录使用过的且需要被记录的操作.
禁止使用密码连接 ssh
打开 ssh 相关的配置文件:
vim /etc/ssh/sshd_config在 sshd_config 文件中添加:
PasswordAuthentication no # 禁止密码登录
PubkeyAuthentication yes # 允许 ssh 公钥登录使修改生效:
systemctl restart sshd.service简化 ssh 日常登陆的体验
每次通过 ssh 命令登陆时都需要输入用户名和 host (IP 地址或域名).
对于经常访问的 host 而言, 这种操作会比较繁琐, 我们可以通过配置来简化.
在 本地设备 的 ~/.ssh/config 文件中编辑:
Host server1
Hostname 192.168.1.100
User root
IdentityFile ~/.ssh/id_rsa_for_server1然后就可以通过 ssh server1 命令登录.
配置 zsh 与 oh-my-zsh
WARNING
zsh 相比于 bash 的优势是可以做更多的定制和扩展.
但整个 Linux 生态对 bash 的支持更好 (例如 cicd runner 的支持). 因此建议在服务器上使用 bash.
在日常开发所用的本地设备上建议使用 Nushell, 如果想要更好的 POSIX 兼容性再考虑用 zsh.
将 zsh 设置为默认 shell:
echo $SHELL # 查看当前使用的 shell
cat /etc/passwd # 查看所有用户的默认 shell
cat /etc/shells # 查看所有可使用的 shell
apt update && apt install -y zsh # 安装 zsh
usermod -s /bin/zsh [username] # 修改默认 shell安装 oh-my-zsh:
# 确保已经安装了 git 和 curl
apt install -y git curl
# 安装 oh-my-zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"配置 oh-my-zsh, 修改 .zshrc 文件:
ZSH_THEME="macovsky"可以设置主题, 让命令行界面更好看 (也会更好用) .plugins=(git)可以设置插件, 给 zsh 拓展功能, 其中 git 是默认插件.
修改服务器时区
将 Linux 系统时间修改为北京时间:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime终止或暂停当前进程
最常用的是 Ctrl+C.
另外也可以考虑使用 Ctrl+Z 暂停当前进程.
需要注意 Ctrl+Z 仅仅是 暂停 了当前任务, 并没有使其终止.
ps -t # 可以通过此命令查看
jobs # 也可以通过此命令查看
fg # 将最近被暂停的任务恢复至前台运行
fg JOB_SPEC # 将某个任务恢复至前台运行
kill PID # 通过此命令终止任务登出当前账户
推荐使用快捷键 Ctrl+D.
也可以使用 logout 或 exit 命令.
- 如果在默认的 shell 会话中开启了新的 shell (例如从 bash 进入 sh), 通过此操作可以返回.
- 如果在默认的 shell 会话中直接按下
Ctrl+D, 则会在结束会话的同时关闭当前的终端窗口. - 使用 ssh 链接远程服务器时, 也可以利用这个操作与服务器断开连接.
修改 pip 的镜像仓库
WARNING
虽然可以使用此方案, 但更推荐使用官方镜像仓库.
国内访问速度慢的问题, 可以通过网络代理解决 (设置环境变量 ALL_PROXY).
由于 pip 的官方镜像仓库速度太慢, 因此可以考虑修改镜像仓库.
需要注意, 使用国内的镜像时, 不要挂代理 (挂着代理使用国内镜像源的 pip 会有报错) .
Windows 创建文件夹 C:\Users\用户名\AppData\Roaming\pip 并新建 pip.ini 文件.
在 pip.ini 中写入以下内容, 保存并退出即可生效.
[global]
timeout = 1000
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.comTIP
对于 Linux 和 macOS 而言, 需要修改的文件是 ~/.pip/pip.conf (文件内容相同).
修改 npm 镜像仓库
WARNING
虽然可以使用此方案, 但更推荐使用官方镜像仓库, 只要能恰当设置网络代理.
详见下文 为 npm 设置代理 以及 为 pnpm 设置代理.
在 ~/.npmrc 中添加以下内容 (使用腾讯云的镜像仓库):
registry=https://mirrors.cloud.tencent.com/npm/也可以使用 npm 命令来修改:
npm config -g set registry="https://mirrors.cloud.tencent.com/npm/"为 npm 设置代理
# 假设代理服务运行在本地设备, 且端口为 7890
npm config -g list -l | grep proxy
npm config -g set proxy=http://localhost:7890
npm config -g set https-proxy=http://localhost:7890为 pnpm 设置代理
# 假设代理服务运行在本地设备, 且端口为 7890
pnpm config -g list
pnpm config -g set proxy=http://localhost:7890
pnpm config -g set https-proxy=http://localhost:7890借助 npm-check 检查更新
TIP
推荐使用 pnpm 代替 npm.
# 全局安装 npm-check
npm install -g npm-check
# 使用 npm-check 命令来检测所有需要更新的全局软件包
npm-check -g用命令打开 Windows 文件夹
# 使用文件管理器打开当前目录
explorer .将内容复制到剪切板
我们有时候需要将文本文件中的内容复制到剪切板, 方便我们粘贴到别的地方.
# 以下命令仅能在 Windows 的 git bash 中运行.
clip < [file-name] # 将 file-name 文件中的内容复制到剪切板
echo "nice" | clip # 将 nice 复制到剪切板
pwd | clip # 将 pwd 命令的输出内容复制到剪切板# 以下命令仅能在 Linux 系统中运行, 且 xsel 需要额外安装.
echo "nice" | xsel --clipboard# 以下命令仅能在 macOS 系统中运行.
pbcopy < [file-name] # 将 file-name 文件中的内容复制到剪切板
echo "nice" | pbcopy # 将 nice 复制到剪切板卸载软件包及其依赖
WARNING
此方案可能会错误卸载本应该被保留的软件包.
因此 不要 在生产环境服务器上使用.
如果只是 apt remove 的话, 无法将软件包的依赖卸载.
此时可以这么做:
apt autoremove [package-name]借助 vim 编辑长命令
有时候我们需要编辑一条很长的命令, 有可能写成多行.
如果写到一半发现写错了, 那么修改起来会比较麻烦, 甚至必须重写.
为了解决这个问题, 我们可以在命令行中使用快捷键 Ctrl+X Ctrl+E 唤起 vim 来编辑.
编辑完成后, 保存并退出 (:wq 或 ZZ) , 就会发现刚刚编辑好的命令已经写在命令行里了.
在命令行中写了一半的命令也可以通过这种方式编辑.
Trouble Shooting
如果 Ctrl+X Ctrl+E 没能唤起 vim, 可能是因为环境变量没设置.
需要将名为 EDITOR 的环境变量设置为 vim.
通过命令行检验是否正确设置:
$ echo $EDITOR
vim快速下载 vscode
国内从官网下载 vscode 速度特别慢, 我们可以通过替换 url 解决.

将上图中红色横线处的域名替换为:vscode.cdn.azure.cn
通过 scp 远程传输文件
TIP
scp 和使用了 ssh 安全方案, 所以需要提前在服务器配置好本地设备的 ssh 公钥.
INFO
我们通常会在本地设备上的命令行中执行 scp 命令, 这里的命令也都在本地执行.
通过 scp 远程传输文件的命令如下:
scp [文件所在路径] [文件目标路径]
scp -r [文件夹所在路径] [文件夹目标路径]举例说明 (这里的 root 是用户名, 请酌情替换):
# 将位于本地设备桌面上的 nice.txt 文件上传至 amiao.com 服务器的 /var/tmp 文件夹
scp ~/Desktop/nice.txt root@amiao.com:/var/tmp/
# 将 amiao.com 服务器的 /var/tmp 文件夹中的 nice.txt 文件下载至本地设备的桌面
scp root@amiao.com:/var/tmp/nice.txt ~/Desktop/
# 将位于本地桌面上的 nice-folder 文件夹 (包括内部的文件) 上传至 amiao.com 服务器的 /var/tmp 文件夹
scp -r ~/Desktop/nice-folder/ root@amiao.com:/var/tmp/
# 将位于 amiao.com 服务器的 /var/tmp/nice-folder 文件夹 (包括内部的文件) 下载至本地桌面
scp -r root@amiao.com:/var/tmp/nice-folder/ ~/Desktop/强制使用 scp 替代 sftp
我们在使用 scp 命令传输文件时, 通常会根据接收端的配置来决定具体的协议.
例如在 /etc/ssh/sshd_config 中可以配置 SubSystem 项来使用 sftp 传输文件.
# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server然而有时候我们可能会遇到问题, 例如无法配置接收端, 或接收端缺少 sftp-server.
此时我们依然希望通过 scp 命令来传输文件, 那么可以使用 -O 选项:
# 强制使用 scp 协议来传输文件
scp -O ~/Desktop/nice.txt root@amiao.com:/var/tmp/将 stdout 输出至文件
有些时候我们希望能将命令的输出记录在文件内.
既将 stdout 输出在控制台, 也将其保存在 log.txt 文件内:
./my_script.sh | tee log.txt在控制台看不到任何输出信息, 但会将 stdout 和 stderr 保存到 log.txt 文件内:
# stdout 对应下方的 1, stderr 对应下方的 2.
./my_script.sh > log.txt 2>&1既将 stdout 和 stderr 输出在控制台, 也将它们保存在 log.txt 文件内:
# stdout 对应下方的 1, stderr 对应下方的 2.
./my_script.sh 2>&1 | tee log.txt打印文件的路径
类似于 pwd, 但是 pwd 只能输出目录, 无法连带上文件名.
我们需要使用 readlink 命令来输出文件路径:
readlink -f [filename]更换 Windows 系统字体
借助开源软件 noMeiryoUI.
WARNING
noMeiryoUI 会修改注册表, 在应用更改前记得 备份 注册表.
Windows 注册表的备份和恢复
举例: 将控制面板的注册表数据备份并恢复 (需要管理员权限).
REG SAVE "HKCU\Control Panel" %USERPROFILE%\Downloads\backup.reg /y REM 备份
REG RESTORE "HKCU\Control Panel" %USERPROFILE%\Downloads\backup.reg REM 恢复Windows 中文输入法的快捷键
默认情况下, Windows 的中文拼音输入法会将 Ctrl+Space 作为切换 中/英 的快捷键.
此快捷键在某些软件中可能会被用到, 造成热键冲突 (输入法为中文时, 无法触发软件中的快捷键).
例如 VSCode 中
Ctrl+Space用于在编辑模式下触发智能提示.
例如在 Blender 中Ctrl+Space会将当前鼠标悬停的窗口最大化.
为此我们可能会希望将 中/英 切换的快捷键设置成别的, 以尽量避免热键冲突.
Windows 11 中修改中文输入法快捷键的具体操作
在 Windows 11 的系统设置中点击下图中的按钮:

在窗口中修改快捷键:

注意在以上窗口中, 快捷键只能设置成 Ctrl 开头的, 否则会失灵.
并且在微软拼音输入法的设置中, 也需要做下图中的设置:

隐藏 Task Scheduler 终端窗口
Windows 中要想执行定时任务, 通常会选择使用 Task Scheduler (因为缺少 crontab).
在默认情况下, Task Scheduler 中设定的任务触发时, 会打开 Terminal 窗口 (执行完后自动关闭).
有些时候, 我们不希望看到 Terminal 窗口 (突然弹窗干扰注意力), 此时可以做如下设置:

在 Git Bash 中使用 CMD 命令
Windows 系统自带的 shell (CMD 或 PowerShell) 可以使用一些命令,
但是 git bash 不能直接使用这些命令, 例如 tree 命令.
解决方案是: 命令本身需要加上 .com 作为结尾, 例如 tree.com.
并且在提供选项时需要多添加一个斜杠.
# 例如在 powershell 中的命令是:
tree /a /f
# 那么在 git bash 中的命令就是:
tree.com //a //fmac 无法运行某个应用程序
尝试在 macOS 中启动某个应用程序时, 遇到了以下错误:
"xxx" is damaged and can’t be opened. You should move it to the Trash.解决方案:
xattr -cr [app-path]移除浏览器的 hsts 记录
参考链接: How to clear HSTS settings in Chrome and Firefox.
chrome://net-internals/#hstsedge://net-internals/#hsts
safari 浏览器: 在设置中点击 Manage Website Data... 按钮.

将 markdown 纳入语言统计
默认情况下, GitHub 不会将 markdown 纳入编程语言统计 (显示在仓库主页的右侧).
如果某个仓库主要由 .md 文件组成 (例如文档仓库), 那就希望能将 markdown 纳入统计.

为此, 需要在 .gitattributes 文件中添加下面这行:
*.md linguist-detectable=true通过 cron 管理定时任务
cron 是一个用于周期性自动执行任务的系统服务, 可用于系统维护, 日志清理, 备份等.crond 是对应的守护进程, 它定期检查所有 cron table, 然后运行已经到期的任务.
可以使用 crontab 命令创建/编辑/管理用户自己的 cron table.
用户级别的 cron table 位于 /var/spool/cron/crontabs 路径下,
但 不建议 直接编辑此文件, 而应该借助以下命令:
# 创建或编辑用户级别的 cron table.
# 如果保存时发现有语法错误, 将会提示错误.
crontab -e有的 Linux 发行版中不一定包含 crontab 命令, 此时可以用其他方式:
/etc/crontab 文件包含了系统范围的 cron table. 可以用它来安排系统级别的任务.
/etc/cron.d/ 目录包含了系统和应用程序特定的 cron table, 每个文件对应一个任务.
TIP
建议在 /etc/cron.d/ 路径下创建文件, 将不同用途的定时任务分成不同的文件.
例如可以创建 /etc/cron.d/gitlab_backup 文件专门用于备份 GitLab, 与其他定时任务独立.
cron table 的语法:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executedTIP
如果不是特别熟悉 cron table 的语法, 可以考虑借助 Cron Expression to Go.
为 VSCode 工程推荐插件
创建 .vscode/extensions.json 文件, 并写入以下内容:
{
"recommendations": [
"xxx", // replace with extension id
"xxx", // replace with extension id
// ...
]
}当任何人使用 vscode 打开此工程时, 如果缺少所推荐的插件, vscode 就会弹窗提示.

用 systemctl 列出 service
# 列出所有当前加载的 service
systemctl list-units --type=service
# 如果只想查看正在运行的 service, 可以加上 --state
systemctl list-units --type=service --state=running
# 列出所有 service, 不论是否加载
systemctl list-unit-files --type=service测量命令执行的用时
# time 之后就是需要测量的命令
time [command]
# 举几个例子
time ls
time git fetch
time cargo check这会显示类似以下内容的输出:
real 0m0.005s
user 0m0.000s
sys 0m0.000s| 类型 | 含义 |
|---|---|
real | 执行命令实际所用的时间 |
user | 在 用户态 中所花费的时间 |
sys | 在 内核态 中所花费的时间 |
通过 ssh 转发端口
假设服务器 (ip 地址为 x.x.x.x) 监听端口 6789 并提供网络服务.
为了方便开发期间的测试, 我们可能希望转发到自己的本地设备上, 此时可以这么做:
ssh root@x.x.x.x -L 16789:example.org:6789使用上述命令后, 就可以访问本地设备的 16789 端口.
(例如在浏览器中输入 localhost:16789).
避免杀毒软件影响性能
系统默认的杀毒软件可能会影响编译时的性能.
可能在杀毒软件看来, 开发者工具是比较可疑的那一类.
解决方案: 让杀毒软件忽略特定的路径.
对于 Windows 系统, 我们可以在系统自带的 Windows Security 中修改.
点击导航栏的 Virus & threat protection, 在页面中点击 Manage settings,
跳转到新的页面后点击 Add or remove exclusions, 最后添加希望被忽略的路径:

考虑将其忽略的路径包括:
C:\Users\USERNAME\.cargo\binC:\Users\USERNAME\AppData\Local\Docker