Avi*_*ano 3 postgresql ssh shell
我的本地可以连接到远程,但它无法连接到 dbserver。远程可以连接到 dbserver(使用 psql)。
我想从我的本地对数据库运行 sql 脚本。
我正在寻找一种在远程打开 psql 并使用 ssh 将我的 stdin 和 stdout 定向到我的本地的方法。
现在在愚蠢的选项中,我这样做:
ssh remote
psql -h db report
password
run my commands
Run Code Online (Sandbox Code Playgroud)
我可以通过这种方式在脚本中完成它,但它丑陋且不允许我与 psql 进行交互会话。
PSQL="PGPASSWORD=mypassword psql -h dbserver -d report"
SQL="SELECT 1"
ssh remote "$PSQL --command 'COPY ($SQL) TO STDOUT WITH CSV;'"
Run Code Online (Sandbox Code Playgroud)
Ps-Python 也可以。
在后台无命令 ssh 会话中使用 ssh 端口转发:
$ ssh -N -f -L 5433:localhost:5432 remoteserver
Run Code Online (Sandbox Code Playgroud)
然后您可以使用它:
$ psql -h localhost -p 5433
Run Code Online (Sandbox Code Playgroud)
psql
命令一样\o
,\i
等会引用文件在本地计算机上。
如果你想在脚本编写方面做到这一点,那么你可能需要使用SSH的-n
选项,在设置选项密码的SSH密钥authorized_keys
,以防止外壳被催生所以所有你能做的就是端口转发指定端口。这对于使用无密码密钥时的安全性非常重要。ssh-agent
提供了一种更安全的替代方案,但它对脚本编写更笨拙。请记住,您的脚本需要记录它产生的后台 ssh 会话的进程 ID,并在任务结束时将其终止。有时使用 shell 作业控制比 ssh 自己的守护模式更容易;这样,shell 就会跟踪后台进程,&
并且可以用kill %jobid
. 请参阅bash 作业控制. (您需要将端口转发 ssh 会话设为后台,以便脚本的执行可以继续并运行psql
)。
对于交互使用你可以调用远程psql
过ssh
,在这种情况下命令一样\o
,\i
,\copy
,等会参考本地服务器上的文件,你SSH方式登录到,不是你的本地计算机:
$ ssh remoteserver psql
Run Code Online (Sandbox Code Playgroud)
这也适用于脚本目的,但比进行端口转发安全性稍差,因为它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__
Run Code Online (Sandbox Code Playgroud)
而不是在后台 ssh 会话中捣乱。这实际上取决于您的优先事项。