我试图登录到SSH服务器,并像执行的东西:
ssh user@domain.com 'sudo echo "foobar"'
不幸的是,我得到一个错误:
sudo: no tty present and no askpass program specified
谷歌告诉我,要么设置环境变量SSH_ASKPASS
或设置askpass
中sudoers
文件。 我的远程机器上的Debian 6上运行,我已经安装的软件包的ssh-askpass和ssh-askpass-gnome和我sudoers
文件看起来像这样:
Defaults env_reset
Defaults askpass=/usr/bin/ssh-askpass
# User privilege specification
root ALL=(ALL) ALL
user ALL=(ALL) ALL
谁能告诉我在做什么错误,以及如何做的更好。
有两种方法来摆脱此错误消息。 最简单的方法是提供一种用于远程须藤过程的伪终端。 您可以选择这样做-t
:
ssh -t user@domain.com 'sudo echo "foobar"'
而不是分配TTY,或设置,可以在命令行中看到一个密码,这样做。
创建呼应的出你的密码就像一个shell文件:
#!/bin/bash
echo "mypassword"
然后复制到节点你想使用scp
是这样的:
scp SudoPass.sh somesystem:~/bin
然后,当你ssh
做到以下几点:
ssh somesystem "export SUDO_ASKPASS=~/bin/SudoPass.sh;sudo -A command -parameter"
另一种方式是运行sudo -S
以“写入的提示的标准误差和读取来自标准输入的密码,而不是使用该终端设备的”(如man
)连同cat
:
cat | ssh user@domain.com 'sudo -S echo "foobar"'
只需输入时被提示输入密码。
一个优点是可以通过远程命令的输出重定向到一个文件中没有它“[须藤]密码...”:
cat | ssh user@domain.com 'sudo -S tar c --one-file-system /' > backup.tar
编辑2013年12月:这里有一个更短的答案:取一两天来熟悉Python库“ 面料 ”。 面料解决了一吨的问题,对于调度远程任务为1台或更多的服务器。
你可能还是会想要设置谁可以运行密码的命令在目标系统上用户名(你可以用布做的也!)。
只是提防面料的某些方面不完全符合Python。 另外,面料的设计首先考虑的系统管理员,谁想要对服务器批处理命令的人。 如果你正在尝试做别的事情(如自动完成一些非常具体的服务器或方案)你要如何“与设置”充分理解和/或@Roles装饰作品。 我没有回头......
(是的,我得到了“远程”的系统工作的SSH远程命令。也就是说,服务器A请求服务器B连接到服务器C,以及命令的返回被认为是在服务器A上即使不直接对话服务器C.使实验室设置更容易!)。
原始响应:对于这个问题,许多解决方案。 马的课程; 有些人比其他人在不同的情况更好。
问的问题是,如何解决“无TTY”的错误。 这似乎是重点,所以我认为在谈论sudoers的就是要解决,以避免TTY问题的一种尝试。
选项1)Askhat的答案的伟大工程......大部分时间。 事实上,始终指定“-tt”,这对多个目标系统的工作原理。
请注意,如果您使用的是SSH文库的paramiko一样,它没有做“-t”的直观方式,你仍然会打的问题。
选项2)我的答案 - 是指定的ASKPASS这是STDIN。 所以这个例子满足sudo的密码要求都和TTY:$壳“SSH user@domain.com“回声‘密码’|须藤-S回声‘foobar的’”
选项3)是的,你可以禁用所有或部分用户输入sudo密码检查,但不是在生产服务器上冷却。
选项4)可以远程“requiretty”(或置“!requiretty”全部或sudoers中一些用户,同样,不是在生产箱冷却。
这是最好的避免服务器更改。 有一天,该服务器将被替换,回到默认的设置,你的脚本将停止工作。
请注意,一旦你了解所有选项,它打开大门,更大量的自动化(例如在脚本中你的笔记本电脑不是可以连接到服务器的主机名列表,并执行对这些服务器sudo的任务,而你需要以复制说脚本下载到这些服务器)。
Defaults askpass=/usr/bin/ssh-askpass
SSH-askpass需要X服务器所以,代替提供一个终端(通过-t
,如由nosid建议的),则可以转发经由X连接-X
:
ssh -X user@domain.com 'sudo echo "foobar"'
然而,根据目前的资料, askpass
被设置在sudo.conf
为Path
,而不是在sudoers
。
如何在sudoers文件中添加此:
user ALL=(ALL) NOPASSWD: ALL