在 /etc/services 中没有条目的情况下连接到 Informix(匹配 sqlhosts)

Connect to Informix without an entry in /etc/services (matching sqlhosts)

我在 Docker 容器中有 Informix 数据库 运行。它们具有不可预测的已发布端口号。

我正在尝试从容器外部进行连接。 Informix 似乎需要 sqlhosts 文件中的一个条目。我可以创建一个包含

的临时 /tmp/sqlhosts.xxx
 mydbservername onsoctcp <container ip address> <servicename>

并与

一起使用
INFORMIXSQLHOSTS=/tmp/sqlhosts.xxx /my.program

my.program 连接到 dbname@mydbservername,我已经验证了这个临时 sqlhosts 文件 正在读取并且 mydbservername 正在被发现。

错误是

Cannot locate <servicename> service in /etc/services.

到目前为止,还很老套,但它似乎与 <servicename> 部分分开工作。在静态环境中,这将匹配 /etc/services 中的条目,但我没有该文件的写入权限(无论如何,动态端口号会使它变得混乱)。

理想情况下,我根本不需要通过 sqlhosts 文件就可以连接到数据库——当我执行时 IP 地址和端口号是已知的my.program——但是有一个层我不知道无法控制 my.program 和数据库连接本身:我只能控制 dbname@server 字符串、用户空间文件系统和环境变量。

如何连接到具有不可预知 IP/port 的 Informix 数据库?

INFORMIXSQLHOSTS 文件中使用端口号而不是服务名称。我大部分时间都这样做。例如,我目前在 lxdev04 机器上使用的一个 sqlhosts 文件包含:

# lxdev04_23 on lxdev04 added 2019-04-24 14:59:32
lxdev04_23      olsoctcp  lxdev04  10040
lxdev04_23_tcp  olsoctcp  lxdev04  10041
lxdev04_23_shm  olipcshm  lxdev04  lxdev04_23
lxdev04_23_str  olipcstr  lxdev04  lxdev04_23
lxdev04_23_ssl  olsocssl  lxdev04  10042
lxdev04_23_enc  olsoctcp  lxdev04  10043         csm=(lxdev04_23_enc)
lxdev04_23_pwd  olsoctcp  lxdev04  10044         csm=(lxdev04_23_pwd)

共享内存和流连接使用一个名称(但它们不在 /etc/services 中),但其余的只使用一个端口号。我用机器名称 (lxdev04) 和一个 2 位素数(也是服务器编号)以及不同连接类型的后缀来命名我的 Informix 服务器。

服务名称(它只是一种在名称字符串和端口号之间进行映射的方式)的优势在于,如果您使用适当的服务(NIS+ 等),它可以跨机器使用,并且它们如有必要,可以更改。更难搞乱数字。