我正在尝试登录ssh服务器并执行类似:
的操作ssh user@domain.com 'sudo echo "foobar"'
不幸的是我收到了一个错误:
sudo: no tty present and no askpass program specified
Google告诉我要么设置环境变量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
有人能说出我做错了什么以及如何做得更好。
答案 0 :(得分:18)
有两种方法可以摆脱此错误消息。简单的方法是为远程sudo进程提供伪终端。您可以使用选项-t
:
ssh -t user@domain.com 'sudo echo "foobar"'
答案 1 :(得分:5)
不是分配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"
答案 2 :(得分:2)
另一种方法是运行sudo -S
以便#34;将提示写入标准错误并从标准输入读取密码而不是使用终端设备" (根据man
)以及cat
:
cat | ssh user@domain.com 'sudo -S echo "foobar"'
只需在提示时输入密码即可。
一个优点是您可以将远程命令的输出重定向到没有" [sudo]密码的文件..."在其中:
cat | ssh user@domain.com 'sudo -S tar c --one-file-system /' > backup.tar
答案 3 :(得分:1)
2013年12月编辑: 这是一个较短的答案:花一两天时间熟悉Python库“Fabric”。 Fabric解决了将远程任务分配给一台或多台服务器的大量问题。
您可能仍希望在目标系统上设置可以运行无密码命令的用户名(并且您也可以使用Fabric来执行此操作!)。
请注意,Fabric的某些方面并不完全是Pythonic。此外,Fabric首先考虑了系统管理员,想要对服务器批量命令的人。如果您正在尝试做其他事情(比如自动化一些非常特定的服务器或场景),您将需要完全理解“使用设置”和/或@roles装饰器的工作原理。我没有回头......
(是的,我在“远程”系统上运行了远程SSH命令。也就是说,服务器A要求服务器B连接到服务器C,即使A没有,服务器A上也会看到命令的返回直接与服务器C交谈。使实验室设置更容易!)。
原始回复: 这个问题有很多解决方案。马匹课程;有些人在不同情况下比其他人好。
问的问题是,如何解决“无TTY”错误。这似乎是焦点所以我认为关于sudoers的讨论只是为了避免TTY问题的解决方法。
选项1)Askhat的答案很有效......大部分时间。实际上,始终指定“-tt”,它适用于更多目标系统。
请注意,如果您使用像Paramiko这样的SSH库,您仍会遇到问题,而Paramiko没有直观的方法来执行“-t”。
选项2)我的回答 - 是指定一个STDIN的ASKPASS。因此,此示例满足sudo密码要求和TTY: $ shell> ssh user@domain.com'echo“password”| sudo -S echo“foobar”'
选项3)是的,您可以对所有或部分用户禁用sudo密码检查,但这在生产服务器上并不酷。
选项4)您可以远程“requiretty”(或为sudoers中的所有或部分用户设置“!requiretty”。再次,在生产盒上不冷静。
最好避免进行服务器更改。有一天,服务器将被替换,设置将恢复为默认值,您的脚本将停止工作。
请注意,一旦您了解了所有选项,它就会打开通向更多自动化的大门(例如,笔记本电脑上的脚本可以连接到服务器主机名列表,并且无需您需要在这些服务器上执行sudo任务将所述脚本复制到这些服务器上。)
答案 4 :(得分:0)
Defaults askpass=/usr/bin/ssh-askpass
ssh-askpass需要X服务器,因此您可以通过-t
转发X连接,而不是提供终端(如{nosid所建议的那样通过-X
):
ssh -X user@domain.com 'sudo echo "foobar"'
但是,根据当前文档,askpass
在sudo.conf
中设置为Path
,而不是sudoers
中。
答案 5 :(得分:-2)
如何在sudoers文件中添加它:
user ALL=(ALL) NOPASSWD: ALL