在 /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+ 等),它可以跨机器使用,并且它们如有必要,可以更改。更难搞乱数字。
我在 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+ 等),它可以跨机器使用,并且它们如有必要,可以更改。更难搞乱数字。