小工具大体验:rlwrap加持下的Oracle/MySQL/SQL Server命令行交互

rlwrap = readline wrapper :不改你的客户端二进制,外面套一层,就能在 sqlplus/rman/dgmgrl 里用方向键、历史、Ctrl+A/ECtrl+R 搜索等"现代化"编辑体验。只对交互有用;脚本里别用。

1 为什么需要 rlwrap(痛点→收益)

  • 原生 sqlplus/rman/dgmgrl 在很多 Linux 发行版上不带 readline:方向键鬼畜、退格混乱、历史丢失。

  • DBA 日常交互多:敲错一行回天乏术,效率肉眼可见地掉。

  • rlwrap 让交互体验直线上升:可编辑、可搜索、可补全(伪字典)、可记忆

  • rlwrap 运行在你的终端目标程序之间,提供一个伪 TTY。

  • 你敲的键先到 rlwrap → 交给 GNU Readline 做行编辑/历史/快捷键 → 再把结果喂给 sqlplus 等。

  • "外套式" :目标程序不需要任何修改;rlwrap 也不解析 SQL,仅做行层面的编辑与历史管理。

2 何时该用、何时不该用

2.1 该用:

  • 你在终端里交互式 使用 sqlplusrmandgmgrlredis-clipsql 等。

  • 你想统一全家桶的交互体验(同一套快捷键、同一套历史搜索逻辑)。

2.2 不该用:

  • 脚本/cron/非交互场景(没有 TTY,rlwrap 反而会制造问题)。

  • 需要严格可重放的自动化执行(历史/别名会引入不确定性)。

  • 你要把密码写在命令行(历史记录会"抓包"到敏感信息,强烈不建议)。

3 安装 & 配置(极简)

3.1 服务器可联网

bash 复制代码
=== 一键设置 rlwrap + Oracle/MySQL/SQL Server 别名(含备份)===
建议使用具备 sudo 权限的账号执行

1) 安装 rlwrap
if command -v dnf >/dev/null 2>&1; then
  sudo dnf -y install rlwrap
else
  sudo yum -y install rlwrap || { sudo yum -y install epel-release && sudo yum -y install rlwrap; }
fi

2) 备份 .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) || true

3) 设置别名
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_profile

4.(可选)系统级:所有用户登录 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";再不行就"源码编译"。以下三种方式和三大库别名都塞进一个框里(任选其一路径执行即可)。

bash 复制代码
# =========================
# 内网服务器安装 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 即可。"
相关推荐
黄焖鸡能干四碗19 分钟前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
橙露26 分钟前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙31 分钟前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生
清水白石00840 分钟前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔42 分钟前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
PyHaVolask1 小时前
SQL注入漏洞原理
数据库·sql
Joren的学习记录1 小时前
【Linux运维大神系列】Kubernetes详解3(kubeadm部署k8s1.23高可用集群)
linux·运维·kubernetes
ptc学习者1 小时前
黑格尔时代后崩解的辩证法
数据库
代码游侠1 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
眠りたいです1 小时前
Docker核心技术和实现原理第二部分:docker镜像与网络原理
运维·网络·docker·容器