SSH直接从std和客户端stdin和stout

我的本地可以连接到远程,但无法连接到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\ipsql命令将引用本地计算机上的文件。

如果你正在尝试这样做的脚本的目的,那么你可能要使用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远程执行此操作时。