18

我正在尝试登录 ssh 服务器并执行以下操作:

ssh user@domain.com 'sudo echo "foobar"'

不幸的是,我遇到了一个错误:

sudo: no tty present and no askpass program specified

谷歌告诉我要么设置环境变量,要么在文件SSH_ASKPASS中设置。我的远程机器在 Debian 6 上运行,我已经安装了ssh-askpassssh-askpass-gnome包,我的文件如下所示:askpasssudoerssudoers

Defaults        env_reset
Defaults        askpass=/usr/bin/ssh-askpass

# User privilege specification
root    ALL=(ALL) ALL
user    ALL=(ALL) ALL

有人可以告诉我我做错了什么以及如何做得更好。

4

6 回答 6

19

有两种方法可以消除此错误消息。简单的方法是为远程 sudo 进程提供一个伪终端。您可以使用以下选项执行此操作-t

ssh -t user@domain.com 'sudo echo "foobar"'
于 2012-04-19T16:18:45.987 回答
4

与其分配 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"
于 2014-02-27T05:04:35.710 回答
2

另一种方法是运行sudo -S以“将提示写入标准错误并从标准输入读取密码而不是使用终端设备”(根据man)连同cat

cat | ssh user@domain.com 'sudo -S echo "foobar"'

只需在提示时输入密码即可。

一个优点是您可以将远程命令的输出重定向到其中没有“[sudo] password for ...”的文件:

cat | ssh user@domain.com 'sudo -S tar c --one-file-system /' > backup.tar
于 2016-11-05T20:22:00.890 回答
1

编辑 2013 年 12 月:这是一个简短的答案:花一两天时间熟悉 Python 库“ Fabric ”。Fabric 解决了将远程任务分派到一台或多台服务器的大量问题。

您可能仍然希望在目标系统上设置一个可以运行无密码命令的用户名(您也可以使用 Fabric 来做到这一点!)。

请注意,Fabric 的某些方面并不完全符合 Python 风格。此外,Fabric 的设计首先考虑了系统管理员,即想要对服务器批量命令的人。如果您正在尝试做其他事情(例如自动化一些非常特定的服务器或场景),您将希望完全了解“使用设置”和/或 @roles 装饰器的工作原理。我没有回头...

(是的,我得到了在“远程”系统上运行的远程 SSH 命令。也就是说,服务器 A 要求服务器 B 连接到服务器 C,并且即使 A 不直接与服务器 A 对话,也可以在服务器 A 上看到该命令的返回服务器 C。使实验室设置更容易!)。

原始回复:这个问题有很多解决方案。课程用马;在不同的情况下,有些人比其他人更好。

提出的问题是,如何解决“无 TTY”错误。这似乎是重点,所以我认为关于 sudoers 的讨论只是试图解决 TTY 问题。

选项 1)Ashat 的回答效果很好……大多数时候。实际上,始终指定适用于更多目标系统的“-tt”。

请注意,如果您使用像 Paramiko 这样的 SSH 库,您仍然会遇到问题,它没有直观的“-t”方式。

选项 2)我的答案是指定一个 ASKPASS,即 STDIN。所以这个例子同时满足 sudo 密码要求和 TTY: $ shell> ssh user@domain.com 'echo "password"|sudo -S echo "foobar"'

选项 3) 是的,您可以对所有或部分用户禁用 sudo 密码检查,但这在生产服务器上并不酷。

选项 4)您可以远程“requiretty”(或为 sudoers 中的所有或部分用户设置“!requiretty”。同样,在生产盒上并不酷。

最好避免更改服务器。有一天,该服务器将被替换,设置恢复为默认设置,您的脚本将停止工作。

请注意,一旦您了解了所有选项,它就会打开更多自动化的大门(例如,您的笔记本电脑上的脚本可以连接到服务器主机名列表,并在这些服务器上执行 sudo 任务,而无需复制说脚本到这些服务器上)。

于 2013-07-30T19:32:06.430 回答
1

Defaults askpass=/usr/bin/ssh-askpass

ssh-askpass 需要 X 服务器,因此您可以通过以下方式转发 X 连接,而不是提供终端(通过-tnosid 建议)-X

ssh -X user@domain.com 'sudo echo "foobar"'

但是,根据当前文档,askpass设置为sudo.confas Path,而不是sudoers.

于 2019-01-03T12:18:52.713 回答
-3

如何在 sudoers 文件中添加它:

user    ALL=(ALL) NOPASSWD: ALL
于 2013-04-05T10:11:08.573 回答