Setup:
- 本地 *nix 机器与 SQL 脚本
script.sql
(Postgres)。 - 远程机器
remote
(Debian 7)与Postgres。- 我可以像
some_user
一样,谁是苏多尔。 - 任何带有Postgres的事情都需要以
postgres
用户的身份完成。 - 服务器仅侦听
localhost:5432
。
- 我可以像
如何在不先将其复制到那里的情况下在remote
上执行script.sql
?
这很有效:
ssh -t some_user@remote 'sudo -u postgres psql -c "COMMANDS FOO BAR"'
-t
标志表示sudo
将在本地终端上正确询问some_user
的密码。
剩下一件事,能够将script.sql
管道输送到psql
.这不起作用:
ssh -t some_user@remote 'sudo -u postgres psql' < script.sql
它失败并显示以下消息:
Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified
编辑:简化示例
Postgres和psql
似乎并没有在这个问题上占太多作用。以下代码具有相同的问题:
ssh some_user@remote xargs sudo ls < input_file
问题似乎是:我们需要向sudo
发送 2 个输入,使用 tty 的密码和传递给ls
的stdin
。
编辑:更简单
ssh localhost xargs sudo ls < input_file
sudo: no tty present and no askpass program specified
添加-t
不起作用:
$ ssh -t localhost xargs sudo ls < input_file
Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified
添加另一个-t
也不起作用:
$ ssh -t -t localhost xargs sudo ls < input_file
<content of input_file>
<waiting on a prompt>
ssh -T some_user@remote "sudo -u postgres psql -f-" < script.sql
"-f-"将从 STDIN 读取脚本。 只需将文件重定向到那里,就可以了。
不要打扰 -t 选项 ssh,您不需要完整的终端。
ssh -T ${user}@${ip} sudo DEBIAN_FRONTEND=noninteractive postgres psql -f- < test.sql
使用 DEBIAN_FRONTEND=noninteractive
解决分配的no tty present
或等效项。