Sudo over SSH混淆了密码tty和stdin



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 的密码和传递给lsstdin

编辑:更简单

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或等效项。

最新更新