我的本地可以连接到远程,但无法连接到dbserver。 远程可以连接到dbserver(使用psql)。
我想从我的本地运行SQL脚本对数据库。
我正在寻找一种方法来在远程打开一个psql,并指定我的标准input和标准输出到我的本地与SSH。
现在在愚蠢的选项我这样做:
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会话:
$ ssh -N -f -L 5433:localhost:5432 remoteserver
然后你可以使用它:
$ psql -h localhost -p 5433
像\o , \i等psql命令将引用本地计算机上的文件。
如果你正在尝试这样做的脚本的目的,那么你可能要使用ssh的-n选项和一个密码的SSH密钥与authorized_keys设置的选项来防止产生一个shell,所以你可以做的就是端口转发给定的端口。 这对使用无密码密钥时的安全性非常重要。 ssh-agent提供了一个更安全的select,但是对于脚本来说这太麻烦了。 请记住,您的脚本将需要logging它产生的后台ssh会话的进程ID,并在任务结束时将其终止。 有时使用shell作业控制比使用ssh自己的守护进程模式更容易; 通过这种方式,shell跟踪与&后台进程,并且可以用kill %jobid终止。 请参阅bash作业控制 。 (您需要后台端口转发ssh会话,以便脚本的执行可以继续并运行psql )。
对于交互式使用,您可以通过ssh调用远程psql ,在这种情况下, \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会话。 真的这取决于你的优先事项是什么。
您可以在远程计算机上使用iptables将postgresqlstream量redirect到数据库服务器。 例如:
iptables -A PREROUTING -s your_machine_ip -p tcp --dport 5432 -j DNAT --to-destination db_server_ip
当然,这需要远程机器上的pipe理员权限。 您还需要启用IP转发。
在你的机器上,你只需连接到远程机器,它会将你redirect到数据库服务器。 这样你就不需要显示的ssh连接了。
请注意,您可能需要查看连接到数据库系统的安全问题,特别是如果您是通过不可信networking远程执行此操作时。