对不起,您必须有一个tty才能运行sudo


13

我已经在Stack Overflow中提出了这个问题,但是有人要求我将其发布在这里。这样也一样。

我使用我的Java程序运行了此命令-

sudo -u <username> -S pwd

我得到了这个输出-

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

我尝试编辑/ etc / sudoers,但它已经包含

<username>       ALL=(ALL)       NOPASSWD: ALL

然后,我了解到可以通过注释掉/ etc / sudoers中的以下代码来完成此操作

# Defaults requiretty

同样,默认情况下,当尝试使用另一个用户执行命令时sudo,我们必须提供我们自己的密码。但这可以通过在/ etc / sudoers-中进行以下更改来更改

Defaults targetpw

我的问题是,是否有可能在Java中执行我的上述命令而无需在任何地方进行任何更改,即通过具有默认设置


1
这就是为什么您要向人为的sudo索取替代品吗?
slhck 2013年

6
如果requiretty默认启用,则似乎是特定于发行版的。根据sudo自己的文档,该功能“默认为关闭”。
mpy

Answers:


3

我不知道如何在Java中运行Shell命令,但请查看ssh命令的-t选项

-t force pseudo-tty allocation.

这就是我需要通过ssh以root身份运行命令时的操作(直接root登录禁用和sudo所需的tty)


1
尽管这种方法可以一眼解决问题,但还不清楚它与问题有何关系。您能详细解释一下吗?
pabouk

1
+1用于解决问题,而无需更改任何默认设置。
2014年

1

我的问题是,是否有可能在Java中执行我的上述命令而无需在任何地方进行任何更改,即通过具有默认设置?

须藤-u -S pwd

简短的回答是“否”,您将需要更改设置以使sudo进行与当前不同的操作。

sudo可能是错误的工具。Sudo的规则可以帮助系统管理员配置一种获取提升特权的方法,而这种特权很难被滥用以获取其他/意外的特权。

如果您考虑sudo为您做什么:

  1. 提示输入密码以验证身份
  2. 提升特权
  3. 然后有选择地以其他用户身份获得特权
  4. 记录sudo使用以获取访问权限或运行命令

如果您想让Java以任意用户身份运行任意命令而又不为这些用户或您自己的用户提供密码,则实际上是在替换sudo。在这种情况下,您应该创建自己的规则以防止滥用。

基本上有两种方法可以做到这一点:

  1. 以提升的特权运行Java,并仔细获取并返回所需的特权(请参阅setuid()seteuid()C函数调用)。
  2. 运行外部程序以在需要时获取提升的特权

在#1的情况下,您的Java程序正在执行sudo的工作,因此您应该实现自己的一组规则以防止滥用。

除了sudo之外,还有其他程序可以执行#2。可以在https://code.google.com/archive/p/exec-wrapper/downloads中找到一个示例

这个方便的shell脚本创建一个C程序来运行另一个命令(通常是一个脚本)。然后,您将C程序编译为二进制文件并标记该setuid根目录,或者实际上它可以被任何用户使用setuid。(模式:4555,所有者:root)

只要您在允许该文件的文件系统上,运行二进制程序将以拥有二进制程序本身的用户标识身份运行配置的命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.