homebrew
官网: https://brew.sh/
# 安装脚本,访问官网获得最新命令
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Homebrew 的两个术语:
- Formulae:软件包,包括了这个软件的依赖、源码位置及编译方法等
- Casks:已经编译好的应用包,如图形界面程序等
常见命令: https://zhuanlan.zhihu.com/p/30704752
禁止更新 Homebrew
注意:Homebrew 只支持当前 Mac 系统的三个大版本。一旦 brew 不支持当前系统(可以使用 brew doctor 命令进行检查),安装软件包就不会直接下载二进制包,而是下载源码编译安装,比较慢和麻烦,并且不保证兼容性和稳定性。所以锁定当前的 brew 版本禁止更新,安装兼容当前系统的软件包即可。
在 .zshrc 文件写入以下内容:
# 1. 禁用 Homebrew 自动更新 (防止隐式更新)。Homebrew 在 install 软件时会自动更新至最新版本
export HOMEBREW_NO_AUTO_UPDATE=1
# 2. 清除 Bottle 镜像设置,使用官方源
unset HOMEBREW_BOTTLE_DOMAIN
# 3. 强制锁定 Formulae 仓库的远程地址 (防止显式更新)
export HOMEBREW_CORE_GIT_REMOTE="https://example.com/not-a-brew-repo/homebrew-core.git"
# === 强制冻结:重定义 brew update 命令 ===
function brew() {
# 如果用户输入了 "brew update",则阻止执行
if [[ "$1" == "update" ]]; then
echo "----------------------------------------------------------------------"
echo "🚫 ERROR: Homebrew 更新已被系统管理员(您自己)永久禁用!"
echo " 您的 macOS 13 版本已不受支持,运行 'brew update' 将破坏您的兼容环境。"
echo " 请运行 'brew install <package>' 或 'brew upgrade <package>' 进行维护。"
echo "----------------------------------------------------------------------"
return 1
fi
# 如果不是 "brew update",则执行原始的 brew 命令,不影响其他命令
command brew "$@"
}
更新
brew update # 更新 Homebrew 自己,同时更新软件包索引信息
brew outdated # 列出可更新的软件
brew upgrade # 更新所有已安装的包。慎用
brew upgrade <package> # 更新指定包
# 锁定软件包的版本,防止其被自动更新。锁定后,即使执行 brew upgrade 也不会更新该软件包
brew pin <package> # 锁定指定包
brew unpin <package> # 取消锁定指定包
安装和卸载软件
brew search <keyword> # 搜索软件包
brew install <package> # 安装某个软件
brew install node # 安装 node
brew install node@18 # 安装指定版本 node
brew uninstall <package> # 卸载某个软件包
其他命令
brew --repo # 显示 _Homebrew_ 本地的 Git 仓库
brew --prefix # 显示 Homebrew_ 安装路径
brew --cellar # 显示 Homebrew Cellar 路径
brew --caskroom # 显示 Homebrew Caskroom 路径
brew --cache # 缓存路径
brew doctor # 检查安装是否存在常见问题,并提供修复建议
# 列出已安装的软件
brew list # 所有的软件,包括 Formulae 和 Cask
brew list --formulae # 所有已安装的 Formulae
brew list --cask # 所有已安装的 Casks
brew list <package> # 列举某个 Formulate 或 Cask 的详细路径
brew info # 显示安装的软件数量、文件数量以及占用空间
brew info <package> # 查看某个软件包的信息
# 清理
brew cleanup # 清理所有旧版本的包
brew cleanup <package> # 清理指定的旧版本包
brew cleanup -n # 查看可清理的旧版本包
# 查看软件包的依赖关系
brew deps git # 查看 git 的依赖关系
brew deps --tree git # 以树形结构显示
brew deps --installed --tree # 查看已安装包的依赖
# 软件服务管理
brew services list # 查看使用brew安装的服务列表
brew services run formula|--all # 启动服务(仅启动不注册)
brew services start formula|--all # 启动服务,并注册
brew services stop formula|--all # 停止服务,并取消注册
brew services restart formula|--all # 重启服务,并注册
第三方仓库管理
brew tap # 列出已添加的仓库
brew tap <user/repo> # 添加某个仓库
brew untap <user/repo> # 移除仓库
brew update # 更新所有仓库
## 举例
## Liberica JDK的GitHub仓库地址:https://github.com/bell-sw/homebrew-liberica
brew tap bell-sw/liberica # 添加 Liberica JDK 的仓库。
brew search jdk # 可以看到bell-sw/liberica/liberica-jdk11等多个版本
brew info bell-sw/liberica/liberica-jdk11-full # 查看软件包信息
brew install --cask bell-sw/liberica/liberica-jdk24-full # 安装对应的软件包
brew uninstall --cask bell-sw/liberica/liberica-jdk24-full # 卸载对应的软件包
java 多版本安装
直接下载安装包进行安装即可
java 多版本查看命令:/usr/libexec/java_home -V
# java的默认安装位置
/Library/Java/JavaVirtualMachines/liberica-jdk-8-full.jdk/Contents/Home/bin/java
/Library/Java/JavaVirtualMachines/liberica-jdk-11-full.jdk/Contents/Home/bin/java
/Library/Java/JavaVirtualMachines/liberica-jdk-17-full.jdk/Contents/Home/bin/java
/Library/Java/JavaVirtualMachines/liberica-jdk-21-full.jdk/Contents/Home/bin/java
使用 command 脚本启动 jar 包,避免 Java 版本导致错误
# 启动冰蝎为例。将这个两行保存到start.command脚本中,赋予执行权限,然后双击即可启动冰蝎,但是会有shell窗口存在,不影响使用。
cd /Users/bluefox/safetools/Behinder
/Library/Java/JavaVirtualMachines/liberica-jdk-11-full.jdk/Contents/Home/bin/java -jar Behinder.jar
python 虚拟环境
有些 python 项目会需要安装依赖,为了避免依赖冲突,使用虚拟环境来隔绝项目依赖。
以 dirsearch 为例。在下载的项目文件夹里(dirsearch 目录)使用命令 python3 -m venv-dirsearch 创建 venv-dirsearch 目录,这个目录就是我们创建的一个虚拟环境。
激活这个虚拟环境:./venv-dirsearch/bin/activate,然后在进行依赖的安装。但是每次都要进入目录里面,先激活这个虚拟环境才可以运行这个项目,可以在 .zshrc 文件里面定义一个别名,简化一下,如下面两条命令。
alias dirsearch='python3 /Users/bluefox/safetools/dirsearch/dirsearch.py'
alias venv-dirsearch='source /Users/bluefox/safetools/dirsearch/venv-dirsearch/bin/activate'
流程:先运行 venv-dirsearch 命令激活对应的虚拟环境,然后就可以正常运行自定义的 dirsearch 命令。
退出虚拟环境,只需要在终端运行 deactivate 命令即可退出。
sublime text 4 记住上次打开的文件:将配置文件里的 hot_exit 选项改为 true
iterm 使用
快捷键
清除当前行:ctrl + u
到行首:ctrl + a
到行尾:ctrl + e
ssh 时自动登录
1)使用 sshpass:/usr/local/bin/sshpass -f .passTX ssh -p 22 root@101.43.245.6
sshpass 安装: https://zhuanlan.zhihu.com/p/458095391
sshpass 实现 iterm 自动登录:/usr/local/bin/sshpass -p 密码 ssh -p 22 root@ip
2)使用触发器:
参考: https://cloud.tencent.com/developer/article/1593867
参考: https://zhuanlan.zhihu.com/p/69379306
SSH 保持连接
修改客户端配置
通过修改客户端设置,以保证连接所有服务器都使用此设置。
sudo vi /etc/ssh/ssh_config # 或 ~/.ssh/config
# Client每隔 60 秒发送一次请求给 Server,然后 Server响应,从而保持连接。添加这一个就行
ServerAliveInterval 60
# Client发出请求后,服务器端没有响应得次数达到3,就自动断开连接,正常情况下,Server 不会不响应
ServerAliveCountMax 3
触发器的使用
1)触发器自动登录

也可以不用 Send Text,选择打开密码管理器手动选择密码,安全性更高。
2)关键词添加高亮显示
同上,只不过将触发动作改为 Highlight Text,然后配置颜色,例如高亮 ip 地址。

3)批量应用 profile 配置
将某个 profile 配置应用到其它 profile 上面。免得一个一个配置。选择一个 profile,点击下方的这个选项

选择要复制的具体配置,例如 Advance,然后选择要复制到哪里,点击 copy 即可。

配置 lrzsz
mac 安装:brew install lrzsz
服务器安装:apt install lrzsz
下载 iterm2 脚本(适配 M1)
# 此脚本fork于 https://github.com/snow-sprite/rzsz
git clone https://github.com/bluefoxqaq/lrzsz-m1-mac.git
将 iterm2-send-zmodem.sh 和 iterm2-recv-zmodem.sh 保存到 /usr/local/bin 目录下,并赋予执行权限。
设置 Iterm2 的 Tirgger 特性,profiles->default->editProfiles->Advanced 中的 Tirgger
添加两条 trigger,分别设置 Regular expression,Action,Parameters,Instant 如下:
Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked
Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

配置好后,可以在服务器使用
- 上传文件:rz
- 下载文件:sz file1 file2 file(n)...
报错问题:这个脚本适配了 m1 mac,其它脚本可能有路径错误。脚本要记得给执行权限。
查看网关
1)使用 ip route

2)使用 netstat -nr

使用 route 注意:route 命令在 mac 下不是这么用的,但是在 linux 下是可以的

安装 ftp
brew install inetutils
修改 hostname
mac 没有 hostname 文件,不能像 Linux 那样直接修改配置文件。可以通过命令修改
sudo scutil --set HostName yourName # yourName,新的hostname值