小工具大体验:rlwrap加持下的Oracle/MySQL/SQL Server命令行交互
rlwrap = readline wrapper:不改你的客户端二进制,外面套一层,就能在 sqlplus/rman/dgmgrl
里用方向键、历史、Ctrl+A/E
、Ctrl+R
搜索等“现代化”编辑体验。只对交互有用;脚本里别用。
1 为什么需要 rlwrap(痛点→收益)
原生
sqlplus/rman/dgmgrl
在很多 Linux 发行版上不带 readline:方向键鬼畜、退格混乱、历史丢失。DBA 日常交互多:敲错一行回天乏术,效率肉眼可见地掉。
rlwrap 让交互体验直线上升:可编辑、可搜索、可补全(伪字典)、可记忆。
rlwrap 运行在你的终端和目标程序之间,提供一个伪 TTY。
你敲的键先到 rlwrap → 交给 GNU Readline 做行编辑/历史/快捷键 → 再把结果喂给
sqlplus
等。“外套式”:目标程序不需要任何修改;rlwrap 也不解析 SQL,仅做行层面的编辑与历史管理。
2 何时该用、何时不该用
2.1 该用:
你在终端里交互式使用
sqlplus
、rman
、dgmgrl
、redis-cli
、psql
等。你想统一全家桶的交互体验(同一套快捷键、同一套历史搜索逻辑)。
2.2 不该用:
脚本/cron/非交互场景(没有 TTY,rlwrap 反而会制造问题)。
需要严格可重放的自动化执行(历史/别名会引入不确定性)。
你要把密码写在命令行(历史记录会“抓包”到敏感信息,强烈不建议)。
3 安装 & 配置(极简)
3.1 服务器可联网
=== 一键设置 rlwrap + Oracle/MySQL/SQL Server 别名(含备份)===
建议使用具备 sudo 权限的账号执行1) 安装 rlwrap
if command -v dnf >/dev/null 2>&1; thensudo dnf -y install rlwrap
elsesudo yum -y install rlwrap || { sudo yum -y install epel-release && sudo yum -y install rlwrap; }
fi2) 备份 .bash_profile(回滚更安心)
2.1 oracle 用户
sudo bash -lc '[ -f ~oracle/.bash_profile ] && cp -a ~oracle/.bash_profile ~oracle/.bash_profile.bak.$(date +%F-%H%M%S) || true'
2.2 当前登录用户
[ -f ~/.bash_profile ] && cp -a ~/.bash_profile ~/.bash_profile.bak.$(date +%F-%H%M%S) || true3) 设置别名
3.1 Oracle(写入 oracle 用户)
sudo bash -lc "cat >> ~oracle/.bash_profile <<'EOF'
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias dgmgrl='rlwrap dgmgrl'
EOF
source ~oracle/.bash_profile"3.2 MySQL/MariaDB + SQL Server(写入当前用户)
cat >> ~/.bash_profile <<'EOF'
alias mysql='rlwrap mysql'
alias mysqladmin='rlwrap mysqladmin'
alias mysqldump='rlwrap mysqldump'
alias mariadb='rlwrap mariadb' # 如使用 MariaDB 客户端
alias sqlcmd='rlwrap sqlcmd'
alias bcp='rlwrap bcp'
alias osql='rlwrap osql' # 如果还在用 osql
EOF
source ~/.bash_profile4.(可选)系统级:所有用户登录 shell 生效
# sudo tee /etc/profile.d/rlwrap_aliases.sh >/dev/null <<'EOF'
# case $- in *i*) ;; *) return ;; esac
# if command -v rlwrap >/dev/null 2>&1; then
# alias sqlplus='rlwrap sqlplus'; alias rman='rlwrap rman'; alias dgmgrl='rlwrap dgmgrl'
# alias mysql='rlwrap mysql'; alias mysqladmin='rlwrap mysqladmin'; alias mysqldump='rlwrap mysqldump'; alias mariadb='rlwrap mariadb'
# alias sqlcmd='rlwrap sqlcmd'; alias bcp='rlwrap bcp'; alias osql='rlwrap osql'
# fi
# EOF
3.2 服务器不可联网
内网环境分三招:有内网仓库直接装;没有就“离线打包 RPM”;再不行就“源码编译”。以下三种方式和三大库别名都塞进一个框里(任选其一路径执行即可)。
# =========================
# 内网服务器安装 rlwrap + 三大数据库别名(任选其一路径)
# =========================# ==== 路径 A:已有公司内网 YUM/DNF 仓库(最省事)====
# EL8/Oracle Linux 8+
sudo dnf -y install rlwrap || true
# EL7/CentOS7/RHEL7
sudo yum -y install rlwrap || true# ==== 路径 B:离线 RPM 安装(推荐通用)====
# 步骤 B1(在一台“可上网且与目标机同发行版/同大版本”的机器上):
# EL8:
# sudo dnf -y install epel-release dnf-plugins-core
# dnf download --resolve rlwrap
# EL7:
# sudo yum -y install epel-release yum-utils
# yumdownloader --resolve rlwrap
# 然后把当前目录下的 *.rpm 打包并拷到内网服务器:
# tar czf rlwrap-offline.tgz *.rpm
# scp rlwrap-offline.tgz user@<内网服务器>:/tmp/# 步骤 B2(在内网服务器上解包并安装):
# cd /tmp && tar xzf rlwrap-offline.tgz
# EL8 优先:
sudo dnf -y localinstall /tmp/*.rpm || \
# EL7 其次:
sudo yum -y localinstall /tmp/*.rpm || \
# 兜底:
sudo rpm -Uvh /tmp/*.rpm --nodeps# ==== 路径 C:源码编译(万不得已)====
# 1) 准备依赖(按发行版选一组):
# EL8:
sudo dnf -y install gcc make readline-devel ncurses-devel || true
# EL7:
sudo yum -y install gcc make readline-devel ncurses-devel || true
# 2) 将 rlwrap-<version>.tar.gz 复制到内网机并编译安装:
# tar xzf rlwrap-*.tar.gz && cd rlwrap-*
# ./configure && make
# sudo make install
# 3) 验证路径(通常在 /usr/local/bin):
which rlwrap || echo "rlwrap 未在 PATH 中,考虑将 /usr/local/bin 加入 PATH"# ==== 验证安装(任一安装路径完成后执行)====
rlwrap -v | head -n1 || echo "rlwrap 未安装成功,请改用其他路径重试"# ==== 起别名前,建议备份 .bash_profile(可回滚)====
# 备份 oracle 用户
sudo bash -lc '[ -f ~oracle/.bash_profile ] && cp -a ~oracle/.bash_profile ~oracle/.bash_profile.bak.$(date +%F-%H%M%S) || true'
# 备份当前登录用户
[ -f ~/.bash_profile ] && cp -a ~/.bash_profile ~/.bash_profile.bak.$(date +%F-%H%M%S) || true# ==== Oracle:写到 oracle 用户 ====
sudo bash -lc "grep -q 'rlwrap sqlplus' ~oracle/.bash_profile 2>/dev/null || cat >> ~oracle/.bash_profile <<'EOF'
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
alias dgmgrl='rlwrap dgmgrl'
EOF
source ~oracle/.bash_profile"# ==== MySQL/MariaDB:写到“你平时登录的账号” ====
grep -q "rlwrap mysql" ~/.bash_profile 2>/dev/null || cat >> ~/.bash_profile <<'EOF'
alias mysql='rlwrap mysql'
alias mysqladmin='rlwrap mysqladmin'
alias mysqldump='rlwrap mysqldump'
alias mariadb='rlwrap mariadb' # 若用 MariaDB 客户端
EOF# ==== SQL Server(Linux 终端):仍写当前账号 ====
grep -q "rlwrap sqlcmd" ~/.bash_profile 2>/dev/null || cat >> ~/.bash_profile <<'EOF'
alias sqlcmd='rlwrap sqlcmd'
alias bcp='rlwrap bcp'
alias osql='rlwrap osql'
EOF# 让当前账号的别名生效
source ~/.bash_profile 2>/dev/null || true# ==== 使用与提示 ====
echo "✅ 完成:交互使用时通过别名启动(sqlplus/mysql/sqlcmd 等);脚本/cron 请直接调用原始二进制,勿用 rlwrap。"
echo "🔙 回滚:用备份文件覆盖回去,再 source 对应的 .bash_profile 即可。"