设定:
script.sql
(Postgres)的本地* nix机器。remote
(Debian 7)。
some_user
的身份登录,这是一个sudoer。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>
答案 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
或等效发布。