linux php exec()中的sudo

x6h2sr28  于 2023-08-03  发布在  Linux
关注(0)|答案(9)|浏览(167)

我不知道这是怎么回事。
所以我想运行一个applescript:第一个月
这在终端中可以正常工作,但当我通过PHP的exec()执行时就不行了;什么都没发生控制台说

no tty present and no askpass program specified ; TTY=unknown ; …

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

  • /etc/sudoers中写入%admin ALL=(ALL) ALL
  • proc_open()而不是exec()

所有这些似乎都不起作用,结果让我抓狂!
那么,有没有一种明确的方法可以让PHP执行一个简单的终端命令呢?
编辑:澄清一下,myscript.scpt是一个简单的appleScript,它可以更改屏幕上的UI(用于更大的项目)。理论上,简单的osascript myscript.scpt就足够了,但是出于某种原因,sudo需要从系统调用some响应。如果sudo可以以某种方式消除,我不认为我会有这个权限问题。

qacovj5a

qacovj5a1#

听起来你需要设置无密码的sudo。试试看:

%admin ALL=(ALL) NOPASSWD: osascript myscript.scpt

字符串
同时注解掉下面一行(在/etc/sudoers中通过visudo),如果它在那里:

Defaults    requiretty

nx7onnlm

nx7onnlm2#

我认为您可以使用visudo为user和command带来特定的访问权限,如下所示:

nobody ALL = NOPASSWD: /path/to/osascript myscript.scpt

字符串
使用PHP:

@exec("sudo /path/to/osascript myscript.scpt ");


假设nobody用户正在运行apache。

vaj7vani

vaj7vani3#

php:创建bash控制台,并执行第一个脚本,调用sudo到第二个脚本,如下所示:

$dev = $_GET['device'];
$cmd = '/bin/bash /home/www/start.bash '.$dev;
echo $cmd;
shell_exec($cmd);

字符串
1./home/www/start.bash

#!/bin/bash
/usr/bin/sudo /home/www/myMount.bash $1

  1. myMount.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

iqxoj9l9

iqxoj9l94#

我最近发布了一个项目,它允许PHP获得一个真实的的Bash shell并与之交互。在这里获取:https://github.com/merlinthemagic/MTS shell有一个pty(伪终端设备,与i.e. ssh会话),如果需要,您可以以root身份获得shell。不确定你是否需要root来执行你的脚本,但是如果你提到了sudo,这是可能的。
下载后,您只需使用以下代码:

$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('/path/to/osascript myscript.scpt');

字符串

o2rvlv0m

o2rvlv0m5#

运行sudo visudo命令,然后将-%sudo ALL=(ALL:ALL)设置为%sudo ALL=(ALL:ALL) NOPASSWD: ALL即可。

ovfsdjhp

ovfsdjhp6#

我尝试exec()后端命令时遇到了类似的情况,并且在Web服务器错误日志中也得到了no tty present and no askpass program specified。原始(错误)代码:

$output = array();
$return_var = 0;
exec('sudo my_command', $output, $return_var);

字符串
bash Package 器解决了这个问题,例如:

$output = array();
$return_var = 0;
exec('sudo bash -c "my_command"', $output, $return_var);


不确定这是否在每种情况下都有效。另外,请确保对my_command部分应用适当的引号/转义规则。

cczfrluj

cczfrluj7#

最安全的方法是使用crontab。将所有命令保存在数据库中,比如mysql表,然后创建一个cronjob来读取这些mysql入口,并通过exec()或shell_exec()执行。请阅读此link以了解更多详细信息。

    • killProcess.php网站首页
lp0sw83n

lp0sw83n8#

我认为直接调用sudo命令可能很困难,因为您正在设置整个服务器,使其在没有密码的情况下工作。
也许作为替代方案,您可以将CRONjob设置为root并监视标志文件。一旦标志文件存在,它将运行osascriptmyscript.scpt,然后删除标志文件。通过这种方式,您将从配置的Angular 保持SUDO的安全性,并且服务器更安全。要运行该脚本,您只需要从PHP触摸标志文件。这当然会引入延迟,无论您运行CRON作业需要多少分钟。这也意味着您必须将输出重定向到一个文件,并对输出进行异步监视,但这是否是一个问题取决于您的应用程序。
但它是一种可能保护服务器的替代方案。

czq61nw1

czq61nw19#

你也可以在实际使用sudo之前使用passthru来验证它:

passthru('sudo -v');
exec('sudo osascript myscript.scpt', $output, $status);

字符串

相关问题