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