设置在sudoers中环境变量SSH_ASKPASS或askpass,RESP(set enviro

2019-07-29 01:35发布

我试图登录到SSH服务器,并像执行的东西:

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

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

sudo: no tty present and no askpass program specified

谷歌告诉我,要么设置环境变量SSH_ASKPASS或设置askpasssudoers文件。 我的远程机器上的Debian 6上运行,我已经安装的软件包的ssh-askpassssh-askpass-gnome和我sudoers文件看起来像这样:

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

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

谁能告诉我在做什么错误,以及如何做的更好。

Answer 1:

有两种方法来摆脱此错误消息。 最简单的方法是提供一种用于远程须藤过程的伪终端。 您可以选择这样做-t

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


Answer 2:

而不是分配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"


Answer 3:

另一种方式是运行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


Answer 4:

编辑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的任务,而你需要以复制说脚本下载到这些服务器)。



Answer 5:

Defaults askpass=/usr/bin/ssh-askpass

SSH-askpass需要X服务器所以,代替提供一个终端(通过-t ,如由nosid建议的),则可以转发经由X连接-X

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

然而,根据目前的资料, askpass被设置在sudo.confPath ,而不是在sudoers



Answer 6:

如何在sudoers文件中添加此:

user    ALL=(ALL) NOPASSWD: ALL


文章来源: set environment variable SSH_ASKPASS or askpass in sudoers, resp