我正在尝试使用makefile编译一些源代码 . 在makefile中有一堆需要作为 sudo
运行的命令 .
当我从终端编译源时,一切正常,并且在第一次运行 sudo
命令等待密码时,make暂停 . 输入密码后,进行简历并完成 .
但我希望能够在NetBeans中编译源代码 . 所以,我开始了一个项目并展示了netbeans在哪里可以找到源代码,但是当我编译项目时,它会给出错误:
sudo: no tty present and no askpass program specified
它第一次命中 sudo
命令 .
我在互联网上查找了这个问题,我发现的所有解决方案都指向一件事:禁用此用户的密码 . 由于此处有问题的用户是root用户 . 我不想那样做 .
还有其他解决方案吗?
21 回答
尝试:
NOPASSWD
行,我的意思是:sudoers
文件中的所有其他行之后 .这对我有用(Ubuntu 14.04) .
授予用户使用该命令而不提示输入密码应该可以解决问题 . 首先打开一个shell控制台并输入:
然后编辑该文件以添加到最后:
例如
将允许用户
john
sudopoweroff
,start
和stop
而不提示输入密码 .在屏幕底部查看您需要在visudo中使用的击键 - 顺便说一句,这不是vi - 并且在没有保存时出现任何问题的第一个迹象 . Health 警告:破坏此文件会产生严重后果,请谨慎编辑!
尝试:
这将消除上述错误 .
在所有选择之后,我发现:
Source
上面的命令仍然需要输入密码 . 要手动删除输入密码,在jenkins等情况下,此命令有效:
sudo
默认情况下将从连接的终端读取密码 . 您的问题是从netbeans控制台运行时没有连接终端 . 因此,您必须使用另一种方法输入密码:称为 askpass 程序 .askpass 程序不是特定的程序,而是任何可以要求输入密码的程序 . 例如在我的系统
x11-ssh-askpass
工作正常 .为此,您必须使用环境变量
SUDO_ASKPASS
或sudo.conf
文件指定要使用的程序(有关详细信息,请参阅man sudo
) .您可以使用选项
-A
强制sudo
使用askpass程序 . 默认情况下,只有在没有连接的终端时才会使用它 .试试这个:
如果你有机会来到这里,因为你不能在Windows10附带的Ubuntu内部进行sudo
从Windows编辑/ etc / hosts文件(带记事本),它将位于:
%localappdata\lxss\rootfs\etc
,添加127.0.0.1 WINDOWS8
,这将摆脱它无法找到主机的第一个错误 .要摆脱
no tty present
错误,请始终执行sudo -S <command>
对于Ubuntu 16.04用户
您需要阅读一个文件:
将文件0440中的文件放在/etc/sudoers.d/myuser中,内容如下:
应该解决这个问题 .
不要忘记:
登录你的linux . 按照命令触发 . 要小心,因为编辑sudoer是一个冒险的主张 .
vi编辑器打开后,进行以下更改:
Defaults requiretty
在詹金斯:
例如:-
您可以使用Mask Password Plugin隐藏密码
确保你
sudo
的命令是PATH
的一部分 .如果您有一个(或多个但不是ALL)命令
sudoers
条目,当命令不是您的路径的一部分(并且未指定完整路径)时,您将获得sudo: no tty present and no askpass program specified
.您可以通过将命令添加到
PATH
或使用绝对路径调用它来修复它,即sudo /usr/sbin/ipset
代替
sudo ipset
这对我有用:
你的用户是“myuser”的地方
对于Docker镜像,那只是:
命令
sudo
失败,因为它尝试提示root密码并且没有分配伪tty(因为它是脚本的一部分) .您需要以root用户身份登录才能运行此命令,或者在
/etc/sudoers
(或:sudo visudo
)中设置以下规则:然后确保您的用户属于
admin
group(或wheel
) .理想情况下(更安全)将root权限限制为特定命令,可以指定为
%admin ALL=(ALL) NOPASSWD:/path/to/program
从jenkins运行包含sudo命令的shell脚本可能无法按预期运行 . 要解决此问题,请按照以
简单步骤:
在基于ubuntu的系统上,运行“$ sudo visudo”
这将打开/ etc / sudoers文件 .
如果你的詹金斯用户已经在该文件中,然后修改为如下所示:
保存文件
重新开始你的詹金斯工作
你不应该再次看到错误信息:)
当您尝试从某个非shell脚本运行终端命令(需要root密码)时,也可能出现此错误,例如来自Ruby程序的
sudo ls
(在反引号中) . 在这种情况下,您可以使用 Expect 实用程序(http://en.wikipedia.org/wiki/Expect)或其替代方法 .例如,在Ruby中执行
sudo ls
而不获取sudo: no tty present and no askpass program specified
,您可以运行:[这使用了 Expect TCL扩展名的替代方法之一:ruby_expect gem] .
作为参考,如果其他人遇到相同的问题,我在一个很好的时间内遇到了这个错误,这不应该发生,因为我使用的是NOPASSWD参数 .
我不知道的是,当没有tty时,sudo可能会引发完全相同的错误消息,并且用户尝试启动的命令不是/ etc / sudoers文件中允许的命令的一部分 .
这是我的问题的文件内容的简化示例:
当bguser尝试启动“sudo command_b arg_b”而没有任何tty(bguser用于某个守护进程)时,他将遇到错误“no tty present and no askpass program specified” .
为什么?
因为/ etc / sudoers文件中的行末缺少逗号...
(我甚至想知道这是否是预期的行为而不是sudo中的错误,因为这种情况的正确错误消息应该是"Sorry, user bguser is not allowed to execute etc.")
我收到此错误是因为我将用户限制为只有一个可执行文件'systemctl'并且错误配置了visudo文件 .
这就是我的所作所为:
但是,您需要包含可执行文件的完整路径,即使它默认位于您的路径上,例如:
这允许我的jenkins用户重新启动服务但没有完全的root访问权限
我想我可以用我的案子来帮助别人 .
首先,我参考上面的答案更改了
/etc/sudoers
中的用户设置 . 但它仍然没有奏效 .在我的情况下,
myuser
在mygroup
.我不需要团体 . 所以,删除那一行 .
(不应该像我一样删除那行,只标记注释 . )
有用!
没有人告诉什么可能导致此错误,如果从一个主机迁移到另一个主机,请记住检查sudoers文件中的主机名:
所以这是我的/ etc / sudoers配置
如果它不匹配
它会弹出这个错误:
也许问题不清楚为什么没有答案匹配它但我在尝试安装需要sudo的sshfs时有相同的错误消息:命令是这样的:
通过添加选项
-o debug
我对这个问题有同样的信息:
因此,通过阅读其他人的回答,我开始在my.server.tld上的
/etc/sudoer.d/user
中创建一个文件:现在我能够安装驱动器而不会给我的用户额外的权利 .
其他选项,不基于NOPASSWD:
使用root权限((sudo netbeans)或类似的)启动Netbeans,这可能会使用root分叉构建过程,因此sudo将自动成功 .
进行suexec所需的操作 - 让root拥有它们,并将模式设置为4755.(这当然会让机器上的任何用户运行它们 . )这样,它们根本不需要sudo .
使用bootsectors创建虚拟硬盘文件不应该是root用户,除非你进行高级设备转发 .