sudo在php exec()

pop*_*850 41 php linux sudo

我不知道这里的交易是什么......

所以我想运行一个AppleScript: sudo osascript myscript.scpt

这在终端中工作正常,但是当我通过PHP执行时却没有exec(); 什么都没发生.控制台说

no tty present and no askpass program specified ; TTY=unknown ; …
Run Code Online (Sandbox Code Playgroud)

我做了我的研究,似乎我错过了sudo命令的密码.我尝试了几种不同的方法来解决这个问题,包括:

  • %admin ALL=(ALL) ALL/etc/sudoers
  • proc_open()不是exec()

似乎没有一个工作,因此驱使我CrAzY!

基本上,是否有一种明确的方式让PHP执行简单的终端命令?

编辑:澄清,myscript.scpt是一个简单的AppleScript,它改变了屏幕上的UI(对于一个更大的项目).从理论上讲,osascript myscript.scpt应该足够了,但是sudo出于某种原因需要从系统中调用一些响应.如果sudo可以以某种方式消除,我不认为我会有这个权限问题.

tom*_*mit 17

听起来你需要设置无密码的sudo.尝试:

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt
Run Code Online (Sandbox Code Playgroud)

还注释掉以下行(在/ etc/sudoers中通过visudo),如果它在那里:

Defaults    requiretty
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个明智的决定:)尽管我试图帮助回答你的原始问题,但我确实认为在webapp中使用sudo有可能引发许多安全问题. (7认同)
  • 不.它根本不在文件中.我开始同意Matchu(下面)关于所有这些安全性的东西.如果我的系统难以实现,那可能是出于安全原因. (2认同)
  • 在需要的地方放置 %admin ALL=(ALL) NOPASSWD: ALL (2认同)

小智 15

如果有人仍然需要这个.您可以使用root密码编写一个纯文本文件,例如〜./.sudopass/sudopass.secret.假设root密码是'12345'.你只用'12345'创建〜./.sudopass/sudopass.secret作为其内容:

12345
Run Code Online (Sandbox Code Playgroud)

然后你执行以下操作:

exec('sudo -u root -S {{ your command }} < ~/.sudopass/sudopass.secret');
Run Code Online (Sandbox Code Playgroud)

请记住仅在受控环境中使用它.

  • 我的天啊.不要忘记周围的根本密码!@tomits答案更安全.另见http://stackoverflow.com/a/3166174/125525 (21认同)
  • 这是一个令人震惊的坏建议 (3认同)

小智 9

我认为您可以使用以下内容对用户和命令进行特定访问visudo:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt
Run Code Online (Sandbox Code Playgroud)

和PHP:

@exec("sudo /path/to/osascript myscript.scpt ");
Run Code Online (Sandbox Code Playgroud)

假设nobody用户正在运行apache.