在sudoers中设置环境变量SSH_ASKPASS或askpass,resp

时间:2012-04-19 16:02:33

标签: ssh environment-variables debian openssh

我正在尝试登录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

有人能说出我做错了什么以及如何做得更好。

6 个答案:

答案 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"'

但是,根据当前文档,askpasssudo.conf中设置为Path,而不是sudoers中。

答案 5 :(得分:-2)

如何在sudoers文件中添加它:

user    ALL=(ALL) NOPASSWD: ALL