[再次更新!] 不要再改变我的问题了,它变得不精确了。
我在 Ubuntu 20.04.2 LTS Focal 上安装了 kdeconnect 1.4.0,它可以正常工作。我能够使用安装 kdeconnect 时使用的用户从命令行发送文本。
我当前的任务是让 Apache2 版本 2.4.41 和 PHP 版本 7.4 执行命令“kdeconnect-cli”。
我以为这就像将命令路径添加到 PHP.INI 一样简单,但是这没有任何作用。
Apache2 以用户 www-data 身份运行,我进行了这些更改以授予权限并运行命令。但它仍然不起作用。
- 我使用了
shell_exec
它,它返回空白。我已经测试过了,没有输出任何结果。
$command = "kdeconnect-cli --send-sms $message --destination $phoneNumber --device 26de31sdfbc6b97f";
$output = shell_exec($command);
echo "<pre>$output</pre>";
- 我将该命令添加到 /etc/php/7.4/cli/php.ini 文件中
include_path =“。:/usr/bin”
- 我将此行添加到 sudoers 文件中
www-数据 ALL=(KDEUSER) NOPASSWD: /usr/bin/kdeconnect_cli
- 我尝试制作一个运行 kdeconnect-cli 的 .sh 文件,它在终端中可以运行,但如果在 PHP 中通过“www-data”运行则不行
我的最终目标是使用 PHP 运行 kdeconnect-cli,我缺少什么?
提前致谢。
PS,不要编辑我的问题。
答案1
单程
PHP 中有一个内置函数,名为shell_exec
(PHP 4、PHP 5、PHP 7、PHP 8)
shell_exec— 通过 shell 执行命令并以字符串形式返回完整输出
其他方式
将 PHP 表单数据保存到系统上的文件中,然后立即在 bash 中解析。步骤很简单:
为将运行 PHP 网页的用户(例如)
www-data
和将运行 bash 脚本的用户(例如)创建具有读写权限的目录you
。在后台运行一个 bash 脚本作为进程来监视目录中新创建的文件,解析它们以发送消息,然后删除它们...使用方式
inotify-tools
如下:#!/bin/bash # Change the path to directory and the device accordingly path_to_directory="/full/path/to/the/directory/to/save/messages/" device="26de31sdfbc6b97f" inotifywait -m "$path_to_directory" -e create | while IFS=' ' read path action file; do echo "$path$file was created" while IFS='|' read -r n m do echo "Sending: $m ---> $n via $device" kdeconnect-cli --send-sms "$m" --destination "$n" --device "$device" done < "$path$file" rm "$path$file" echo "$path$file was deleted" done
如果尚未安装,请使用 安装。之后,将上述代码保存到脚本文件(如)
inotify-tools
,使用使脚本文件可执行,然后使用 运行它并保持其运行。sudo apt install inotify-tools
send.sh
chmod +x send.sh
bash send.sh
让您的 PHP 页面将表单数据(编号和消息)保存到同一目录中的文件中,并在一行中使用分隔符(如
|
...)并随机生成文件名以避免覆盖同一个文件。以以下 PHP 代码片段为例:<?PHP //Modify the following three lines. //You can dynamically assign your form number to $number and //your form message to $message $number="0096650123456"; $message="This is a test message."; $path_to_directory="/full/path/to/the/directory/to/save/messages/"; //Do not modify beloww this line $content=$number . "|" . $message . "\n"; $filename=$path_to_directory . rand(0000, 9999) . ".msg"; file_put_contents($filename, $content);