KingbaseES KSQL 免密登录的几种方式

大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。

前言

经常使用 Oracle 数据库的 DBA 对 sqlplus 命令肯定不陌生,而在 KingbaseES 数据库中,对应的工具就是 KSQL。

熟悉我文章的朋友可能知道,我在使用 sqlplus 工具时,经常使用 sas 来快速连接 Oracle 数据库,其实就是使用 alias 别名的方式创建了一个快捷方式,虽然是一个小技巧,但是对数据库维护来说十分便捷。

在接触使用 KingbaseES 时,自然也想着研究一下 KSQL 有没有类似的快捷方式使用,经过仔细研究发现,KSQL 实现的方式比 Oracle 多多了,本文就介绍一下 KSQL 免密登录的几种方式,以及我总结的最佳免密配置方式。

金仓数据库 KingbaseES V9 单机安装指南

介绍

KingbaseES KSQL 工具面向的是所有使用 KingbaseES 的用户,主要是数据库管理员人员。KSQL 是 KingbaseES 数据库的一个组件,在安装 KingbaseES 数据库时,默认会安装 KSQL。

KSQL 工具很容易使用,没接触过的建议查看 ksql 帮助命令来大致了解一下如何使用:

[kingbase@kes:/home/kingbase]$ ksql --help
ksql是Kingbase 的交互式客户端工具。
使用方法:
  ksql [选项]... [数据库名称 [用户名称]]
通用选项:
  -c, --command=命令       执行单一命令(SQL或内部指令)然后结束
  -d, --dbname=DBNAME      指定要连接的数据库 (默认:"kingbase")
  -f, --file=文件名        从文件中执行命令然后退出
  -l, --list               列出所有可用的数据库,然后退出
  -v, --set=, --variable=NAME=VALUE
                           设置ksql变量NAME为VALUE
                           (例如,-v ON_ERROR_STOP=1)
  -V,--version            输出版本信息,然后退出
  -X, --no-ksqlrc          不读取启动文档(~/.ksqlrc)
  -1 ("one"), --single-transaction
                           作为一个单一事务来执行命令文件(如果是非交互型的)
  -?, --help[=options]     显示此帮助,然后退出
      --help=commands      列出反斜线命令,然后退出
      --help=variables     列出特殊变量,然后退出

输入和输出选项:
  -a, --echo-all           显示所有来自于脚本的输入
  -b, --echo-errors        回显失败的命令
  -e, --echo-queries       显示发送给服务器的命令
  -E, --echo-hidden        显示内部命令产生的查询
  -L, --log-file=文件名    将会话日志写入文件
  -M, --enable-client-encryption
                           启用使用客户端加密功能
  -n, --no-readline        禁用增强命令行编辑功能(readline)
  -o,--outPut=FILENAME    将查询结果发送到file(or |pipe)
  -q,--quiet              静静地运行(没有消息,只有查询输出)
  -s, --single-step        单步模式 (确认每个查询)
  -S, --single-line        单行模式 (一行就是一条 SQL 命令)

输出格式选项 :
  -A,--no-align           不对齐表输出模式
      --csv                CSV(逗号分隔值)表输出模式
   -F, --field-separator=STRING
                            用于未对齐输出的字段分隔符(默认值:"|")
  -H,--html               HTML表输出模式
  -P, --pset=变量[=参数]   设置将变量打印到参数的选项(查阅 \pset 命令)
   -R, --record-separator=STRING
                            记录分隔符用于未对齐输出(默认:newline)
  -t, --tuples-only        只打印记录i
  -T, --table-attr=文本    设定 HTML 表格标记属性(例如,宽度,边界)
  -x,--expanded           打开扩展表outPut
   -z, --field-separator-zero
                            将未对齐输出的字段分隔符设置为零字节
  -0, --record-separator-zero
                            将未对齐输出的记录分隔符设置为零字节

联接选项:
  -h, --host=主机名        数据库服务器主机或socket目录(默认:"本地接口")
  -p, --port=端口          数据库服务器的端口(默认:"54321")
 -U,--username=USERNAME  数据库用户名(默认:"kingbase")
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)
 -C,--client-cert-path       cert-authentication文件路径
 -k,--client-certkey-path    证书认证私钥文件路径
  -K, --client-certpin-path    读取私钥文件的加密pin码文件路径

更多信息,请在ksql中输入 "\?"(用于内部命令),
或者参考Kingbase ES文档中的ksql章节。

这里只是简单介绍以下 KSQL 工具。

KSQL 连接数据库

常规连接方式

想要使用 KSQL 连接数据库,首先得知道数据库的名称,主机名,数据库用户以及数据库的端口号:

  • -d:要连接的数据库名称,默认为 kingbase
  • -h:数据库服务器主机名,默认为本地接口
  • -p:数据库服务器的端口,默认为 54321
  • -U:数据库用户名,默认为 kingbase
  • -w:永远不提示输入口令

连接数据库:

## 使用全参数指定方式连接,这种方式比较繁琐,但是规范
[kingbase@kes:/home/kingbase]$ ksql -d kingbase -h kes -p 54321 -U system
用户 system 的口令:
输入 "help" 来获取帮助信息.

kingbase=

为了更快捷的连接数据库,可以尝试不指定参数名称来连接,忽略参数,自动填充默认值:

[kingbase@kes:/home/kingbase]$ ksql kingbase system
用户 system 的口令:
输入 "help" 来获取帮助信息.

kingbase=

有默认值的选项可以不用指定,当不指定参数选项时,第一个被接收到的值将被解释为数据库名称(如果已经给出数据库名称,就解释为用户名)。不指定主机名,则默认连接当前主机上的数据库。

免密连接方式

alias 方式

这里参照我在 oracle 数据库的习惯,第一个想到的是使用别名的方式,实现起来最简单快捷:

## 配置别名 ksql
cat<<-EOF>>~/.bash_profile
alias ksql='ksql -d kingbase -h kes -p 54321 -U system'
EOF

source .bash_profile

## 直接使用 ksql 连接数据库
[kingbase@kes:/home/kingbase]$ ksql
用户 system 的口令:
输入 "help" 来获取帮助信息.

kingbase=

但是,测试下来我感觉这种方式有点鸡肋,因为需要手动输入数据库用户密码,ksql 不支持明文指定密码的选项,好像没有类似 / as sysdba 类似的本地认证登录方式(有可能支持,但是我不知道,知道的朋友可以留言告知,谢谢)。

环境变量方式

在查阅官方文档之后发现,可以通过环境变量的方式,将 KINGBASE_DATABASE、 KINGBASE_HOST、KINGBASE_PORT、KINGBASE_USER 以及 KINGBASE_PASSWORD 设置为适当的值来实现免密登录:

cat<<-EOF>>~/.bash_profile
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=kingbase
export KINGBASE_USER=system
export KINGBASE_PASSWORD=kingbase
EOF

source ~/.bash_profile

## 此时只需要直接执行 ksql 就可以连接数据库
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.

kingbase=

这个方式完全实现了我的需求,但是明文密码存放在环境变量配置文件中,比较容易被人看到,不太安全。

kbpass 文件方式

除了环境变量方式,官方提供了 ~/.kbpass 文件来避免输入密码的方式,也很方便, kbpass 文件内容格式如下:

hostname:port:database:username:password

需要注意的几点:

  • 1、当密码包含冒号 : 时,必须用反斜杠 \: 进行转义
  • 2、字符 * 可以匹配任何字段中的任何值(密码除外)
  • 3、在 Unix 系统上,口令文件上的权限必须不允许所有人或组内访问(即权限为 0600),如果权限没有这么严格,该文件将被忽略。

配置 kbpass 文件免密登录:

## 创建 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF

## 授权文件 600 权限,仅用于 kingbase 用户访问
## 警告: 口令文件"/home/kingbase/.kbpass"的访问权限过大; 权限应设置为 u=rw (0600)或更少
chmod 600 ~/.kbpass

## 使用 kbpass 需要严格指定参数选项信息,否则无法匹配 kbpass 文件中的密码
[kingbase@kes:/home/kingbase]$ ksql -h kes -p 54321 -d kingbase -U system
输入 "help" 来获取帮助信息.

kingbase=

这种方式虽然不需要明文显示密码,并且能不需要输入密码连接数据库,但是需要严格指定数据库信息,也不太方便。

最佳免密方式

alias + kbpass

使用别名的好处就是配置比较方便快捷:

## 配置别名
cat<<-EOF>>~/.bash_profile
alias ksql='ksql -d kingbase -h kes -p 54321 -U system'
EOF

source .bash_profile

## 配置 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF

chmod 600 ~/.kbpass

## 免密连接
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.

kingbase=

如果有多个数据库实例,只需要创建多个别名,然后在 kbpass 文件中加上对应数据库行即可,例如:

## 配置连接 test 库
cat<<-EOF>>~/.bash_profile
alias ksql1='ksql -d test -h kes -p 54321 -U system'
EOF

source .bash_profile

## kbpass 文件新增一行配置
cat<<-EOF>>~/.kbpass
kes:54321:test:system:kingbase
EOF

## 免密连接 test 库
[kingbase@kes:/home/kingbase]$ ksql1
输入 "help" 来获取帮助信息.

test=

环境变量 + kbpass

使用环境变量的方式:

## 创建一个数据库名称命名的 .kingbase 环境变量文件,这样方便多个数据库进行切换
cp .bash_profile .kingbase

## 增加对应环境变量的配置信息,不需要加密码变量
cat<<-EOF>>~/.kingbase
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=kingbase
export KINGBASE_USER=system
EOF

source ~/.kingbase

## 配置 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF

chmod 600 ~/.kbpass

## 免密连接
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.

kingbase=

如果有多个数据库实例,只需要创建多个环境变量文件,然后在 kbpass 文件中加上对应数据库行即可,例如:

## 创建一个数据库名称命名的 .test 环境变量文件
cp .bash_profile .test

## 增加对应环境变量的配置信息,不需要加密码变量
cat<<-EOF>>~/.test
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=test
export KINGBASE_USER=system
EOF

source ~/.test

## kbpass 文件新增一行配置
cat<<-EOF>>~/.kbpass
kes:54321:test:system:kingbase
EOF

## 免密连接 test 库
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.

test=

总结

本文介绍了 KSQL 连接 KingbaseES 数据库的多种方式,通过以上测试以及对安全性的要求,建议大家可以使用 alias 或环境变量 + kbpass 的方式来配置免密登录,配置简单,使用便捷。

- END -

请使用浏览器的分享功能分享到微信等