暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

KingbaseES KSQL 免密登录的几种方式

原创 Lucifer三思而后行 2024-09-29
1150

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

目录

前言

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

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

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

介绍

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 的方式来配置免密登录,配置简单,使用便捷。

后记

后来,群友提供了一个官方本地认证的免密方式,配置比较简单。

修改 /data/sys_hba.conf 配置文件:

# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all scram-sha-256

将 local 认证方式 scram-sha-256 修改为 trust 即可:

# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust

重启数据库生效:

sys_ctl restart

本地免密连接:

[kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321 ksql (V8.0) 输入 "help" 来获取帮助信息. test=> exit

如果遇到无法免密登录的情况:

[kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321 用户 sso 的口令: ksql: 错误: 无法连接到服务器:fe_sendauth: no password supplied

可能是因为配置了以下环境变量:

export KINGBASE_HOST=kes export KINGBASE_PORT=54321 export KINGBASE_DATABASE=test export KINGBASE_USER=system

注释之后,退出重登 kingbase 主机用户即可:

[kingbase@kes:/home/kingbase]$ exit 注销 [root@kes ~]# su - kingbase 上一次登录: 六 10月 12 10:29:19 CST 2024 pts/0 上 [kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321 ksql (V8.0) 输入 "help" 来获取帮助信息. test=> exit

所以,看起来最佳免密方式为:sys_hba.conf + alias

alias ksystem='ksql test system' alias ksso='ksql test sso'

别名连接:

[kingbase@kes:/home/kingbase]$ ksystem ksql (V8.0) 输入 "help" 来获取帮助信息. test=# \conninfo 以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test" test=# \q [kingbase@kes:/home/kingbase]$ ksso ksql (V8.0) 输入 "help" 来获取帮助信息. test=> \conninfo 以用户 "sso" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test" test=> \q

后续补充就到这了。

最后修改时间:2024-10-12 10:36:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论