php exec() 中的 sudo
- 2024-09-30 15:23:00
- admin 原创
- 96
问题描述:
我不知道这是怎么回事……
所以我想运行一个 applescript:sudo osascript myscript.scpt
这在终端中运行良好,但当我通过 PHP 执行它时却不行exec()
;什么也没有发生。控制台显示
no tty present and no askpass program specified ; TTY=unknown ; …
我做了研究,似乎我忘记了命令的密码sudo
。我尝试了几种不同的方法来解决这个问题,包括:
写
%admin ALL=(ALL) ALL
/etc/sudoers
而
proc_open()
不是exec()
这些似乎都不起作用,结果让我发疯了!
那么基本上,是否有一种明确的方法可以让 PHP 执行一个简单的终端命令?
编辑:澄清一下,myscript.scpt
是一个简单的 appleScript,用于更改屏幕 UI(适用于较大的项目)。理论上,简单osascript myscript.scpt
就足够了,但是sudo
出于某种原因,需要调用系统的某些sudo
响应。如果可以以某种方式消除,我想我就不会遇到这个权限问题了。
解决方案 1:
听起来您需要设置无密码 sudo。尝试:
%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt
如果存在以下行,也请将其注释掉(在 /etc/sudoers 中通过 visudo):
Defaults requiretty
解决方案 2:
visudo
我认为你可以用这样的方式给用户和命令带来特定的访问权限:
nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt
使用 php 的话:
@exec("sudo /path/to/osascript myscript.scpt ");
假设nobody
用户正在运行 apache。
解决方案 3:
php:创建了 bash 控制台,并执行第一个脚本,该脚本调用第二个脚本的 sudo,如下所示:
$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);
/home/www/start.bash
#!/bin/bash /usr/bin/sudo /home/www/myMount.bash $1
我的Mount.bash:
#!/bin/bash function error_exit { echo "Wrong parameter" 1>&2 exit 1 } ..........
oc,您想从没有 root 权限的 root 级别运行脚本,为此请创建并修改 /etc/sudoers.d/mount 文件:
www-data ALL=(ALL:ALL) NOPASSWD:/home/www/myMount.bash
不要忘记 chmod:
sudo chmod 0440 /etc/sudoers.d/mount
解决方案 4:
我最近发布了一个项目,允许 PHP 获取并与真正的 Bash shell 交互。在此处获取:<https://github.com/merlinthemagic/MTS>
shell 有一个 pty(伪终端设备,与 ssh 会话中的设备相同),如果需要,您可以以 root 身份获取 shell。不确定您是否需要 root 来执行脚本,但鉴于您提到了 sudo,所以很有可能。
下载后,您只需使用以下代码:
$shell = MTSFactories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('/path/to/osascript myscript.scpt');
解决方案 5:
运行sudo visudo
命令然后设置-%sudo ALL=(ALL:ALL)
它%sudo ALL=(ALL:ALL) NOPASSWD: ALL
就会起作用。
解决方案 6:
您也可以在实际使用 sudo 之前使用 passthru 来验证它:
passthru('sudo -v');
exec('sudo osascript myscript.scpt', $output, $status);
解决方案 7:
exec()
我在尝试后端命令时也遇到了类似的情况,并且也no tty present and no askpass program specified
进入了 Web 服务器错误日志。原始(错误)代码:
$output = array();
$return_var = 0;
exec('sudo my_command', $output, $return_var);
包装器bash
解决了这个问题,例如:
$output = array();
$return_var = 0;
exec('sudo bash -c "my_command"', $output, $return_var);
不确定这是否适用于所有情况。另外,请确保对my_command
部分应用适当的引用/转义规则。
解决方案 8:
最安全的方法是使用 crontab。即,将所有命令保存在数据库(例如 mysql 表)中,并创建一个 cronjob 来读取这些 mysql 条目并通过 exec() 或 shell_exec() 执行。请阅读此链接以获取更多详细信息。
终止进程.php
解决方案 9:
我认为直接调用 sudo 命令可能很困难,因为您要设置整个服务器以使其无需密码即可工作。
也许作为替代方案,您可以以 root 身份设置 CRONjob 并监视标志文件。一旦标志文件存在,它将运行 osascript myscript.scpt,然后删除标志文件。这样,您将从配置的角度确保 SUDO 安全,并使服务器更安全。要运行脚本,您只需从 PHP 触摸标志文件。当然,这会引入延迟,无论您运行 CRON 作业需要多少分钟。这也意味着您必须将输出重定向到文件并对输出进行异步监视,但这是否是一个问题取决于您的应用程序。
但这是一种可能保护服务器的替代方案。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件