Sudo over SSH混合密码tty和stdin

时间:2016-03-01 14:16:35

标签: ssh sudo

设定:

  • 带有SQL脚本script.sql(Postgres)的本地* nix机器。
  • 与Postgres的远程机器remote(Debian 7)。
    • 我可以以some_user的身份登录,这是一个sudoer。
    • 任何有Postgres的内容都需要以postgres用户身份完成。
    • 服务器仅侦听localhost:5432

如何在script.sql上执行remote而不先将其复制到那里?

这很有效:

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发送密码,将stdin发送到ls

编辑:更简单

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>

2 个答案:

答案 0 :(得分:1)

ssh -T some_user@remote "sudo -u postgres psql -f-" < script.sql

“ - f-”将从STDIN读取脚本。只需将文件重定向到那里,就可以了。

不要使用-t选项来打扰ssh,你不需要一个完整的终端。

答案 1 :(得分:0)

def encrypt(plaintext, key):
    cipherText = ((p + q) - 75 for (p, q) in zip(map(ord, plaintext), 
                                                 map(ord, itertools.cycle(key))))
    cipherText = ((c - 65) % 26 + 65 for c in cipherText)
    return ''.join(map(chr, cipherText))

使用ssh -T ${user}@${ip} sudo DEBIAN_FRONTEND=noninteractive postgres psql -f- < test.sql 来解析DEBIAN_FRONTEND=noninteractive或等效发布。