我的本地可以连接到远程,但无法连接到数据库服务器。远程可以连接到 dbserver(使用 psql)。
我想从本地针对数据库运行 sql 脚本。
我正在寻找一种在远程打开 psql 并使用 ssh 将我的 stdin 和 stdout 定向到本地的方法。
现在在愚蠢的选择中我这样做:
ssh remote
psql -h db report
password
run my commands
我可以用这种方式在脚本中完成,但它的丑陋和 dosnt 允许我与 psql 进行交互式会话。
PSQL="PGPASSWORD=mypassword psql -h dbserver -d report"
SQL="SELECT 1"
ssh remote "$PSQL --command 'COPY ($SQL) TO STDOUT WITH CSV;'"
Ps- Python 也可以。
使用带有后台无命令 ssh 会话的 ssh 端口转发:
然后你可以使用:
psql
\o
、等命令\i
将引用本地计算机上的文件。如果您出于脚本目的而尝试执行此操作,那么您可能希望使用 ssh 的
-n
选项和无密码的 ssh 密钥,其中设置了选项authorized_keys
以防止生成 shell,因此您所能做的就是转发给定端口。这对于使用无密码密钥时的安全性非常重要。ssh-agent
提供了一种更安全的替代方案,但它对于脚本编写来说比较笨拙。请记住,您的脚本需要记录它生成的后台 ssh 会话的进程 ID,并在任务结束时将其终止。有时使用 shell 作业控制比 ssh 自己的守护进程模式更容易;这样 shell 就会跟踪以 为背景的进程,&
并且可以用 终止它kill %jobid
。请参阅bash 作业控制. (您需要将端口转发 ssh 会话置于后台,以便脚本的执行可以继续并运行psql
)。对于交互式使用,您只需调用远程
psql
overssh
,在这种情况下,诸如\o
,\i
,\copy
等命令将引用您 ssh 到的服务器的本地文件,而不是您的本地计算机:这也适用于脚本目的,但比端口转发安全性稍差,因为
psql
它是一个非常强大的程序,允许您读取和写入任意文件、生成 shell 等。您不能真正限制无密码 ssh 密钥可以做什么如果允许远程调用psql
. 另一方面,写起来要简单得多:而不是处理后台 ssh 会话。实际上,这取决于您的优先事项。
您可以在远程计算机上使用 iptables 将 postgresql 流量重定向到数据库服务器。例如:
当然,这需要远程机器的管理员权限。您还需要启用 IP 转发。
从您的机器上,您只需连接到远程机器,它就会将您重定向到数据库服务器。这样您就不需要显示的 ssh 连接。
请注意,您可能需要查看有关如何连接到数据库系统的安全问题,尤其是当您通过不受信任的网络远程执行此操作时。