我不知道这是怎么回事。
所以我想运行一个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
可以以某种方式消除,我不认为我会有这个权限问题。
9条答案
按热度按时间qacovj5a1#
听起来你需要设置无密码的sudo。试试看:
字符串
同时注解掉下面一行(在/etc/sudoers中通过visudo),如果它在那里:
型
nx7onnlm2#
我认为您可以使用
visudo
为user和command带来特定的访问权限,如下所示:字符串
使用PHP:
型
假设
nobody
用户正在运行apache。vaj7vani3#
php:创建bash控制台,并执行第一个脚本,调用sudo到第二个脚本,如下所示:
字符串
1./home/www/start.bash
型
型
oc,你想在没有root权限的情况下从root级别运行脚本,要做到这一点,请创建和修改/etc/sudoers.d/mount文件:
型
别忘了chmod:
型
iqxoj9l94#
我最近发布了一个项目,它允许PHP获得一个真实的的Bash shell并与之交互。在这里获取:https://github.com/merlinthemagic/MTS shell有一个pty(伪终端设备,与i.e. ssh会话),如果需要,您可以以root身份获得shell。不确定你是否需要root来执行你的脚本,但是如果你提到了sudo,这是可能的。
下载后,您只需使用以下代码:
字符串
o2rvlv0m5#
运行
sudo visudo
命令,然后将-%sudo ALL=(ALL:ALL)
设置为%sudo ALL=(ALL:ALL) NOPASSWD: ALL
即可。ovfsdjhp6#
我尝试
exec()
后端命令时遇到了类似的情况,并且在Web服务器错误日志中也得到了no tty present and no askpass program specified
。原始(错误)代码:字符串
bash
Package 器解决了这个问题,例如:型
不确定这是否在每种情况下都有效。另外,请确保对
my_command
部分应用适当的引号/转义规则。cczfrluj7#
最安全的方法是使用crontab。将所有命令保存在数据库中,比如mysql表,然后创建一个cronjob来读取这些mysql入口,并通过exec()或shell_exec()执行。请阅读此link以了解更多详细信息。
lp0sw83n8#
我认为直接调用sudo命令可能很困难,因为您正在设置整个服务器,使其在没有密码的情况下工作。
也许作为替代方案,您可以将CRONjob设置为root并监视标志文件。一旦标志文件存在,它将运行osascriptmyscript.scpt,然后删除标志文件。通过这种方式,您将从配置的Angular 保持SUDO的安全性,并且服务器更安全。要运行该脚本,您只需要从PHP触摸标志文件。这当然会引入延迟,无论您运行CRON作业需要多少分钟。这也意味着您必须将输出重定向到一个文件,并对输出进行异步监视,但这是否是一个问题取决于您的应用程序。
但它是一种可能保护服务器的替代方案。
czq61nw19#
你也可以在实际使用sudo之前使用passthru来验证它:
字符串