0

编辑其实可以用配置文件的路径作为函数的参数来解决问题

sm.ReadConfig(Filename="/home/myuser/.gammurc")

我正在为 python 使用 Gammu 库。我的想法是创建一个可以发送 SMS 的 python 脚本,以便以后从脚本 PHP 调用它。

这是python脚本的代码。

#!/usr/bin/env python

import gammu
import sys

sm = gammu.StateMachine()

sm.ReadConfig()

if len(sys.argv) != 3:
    print 'Uso: sms.py MENSAJE DESTINATARIO'
    sys.exit(1)

rawtext = sys.argv[1]
spttext = rawtext.split("*e*")
text = " ".join(spttext)

sm.Init()

message = {
    'Text': text,
    'SMSC': {'Location': 1},
    'Number': sys.argv[2],
}

if (sm.SendSMS(message)):
    print "OK"

如果我从终端使用此脚本工作正常,问题是当我使用 exec() 从 PHP 调用脚本时,在运行 ReadConfig() 函数时我从 Gammu 库中收到错误:

gammu.ERR_CANTOPENFILE: {'Text': u'Can not open specified file.', 'Code': 28, 'Where': 'FindGammuRC via ReadConfig'}

我已经允许网络服务器使用 gammu,运行命令“sudo adduser www-data dialout”,但我不知道还有什么问题。

这是我从 PHP 调用脚本的方式:

$rcmd="python /home/my_user/Escritorio/pythonSMS/sms.py -V 2>&1";
exec($rcmd, $output);

我正在寻找任何帮助或建议,谢谢。

4

1 回答 1

0

从您发布的错误看来,当通过 PHP 执行它时,似乎存在目录权限或沿路径设置的读取权限,以防止 PHP 用户(假设这是通过 apache 等 Web 服务器执行)获取文件。

最简单的方法是这样简单:

脚本 A:

#!/usr/bin/env python
file = open('/home/myuser/.gammurc' , r)
for line in file:
    print line

脚本 B:

<?php
    $cmd = '/path/to/script/A';
    exec($cmd);
?>

理论上,这应该会产生类似的错误。如果是这种情况,请检查 .gmamurc 上的目录权限和文件权限。如果这是通过 Web 服务器执行的,则您可能需要对“myuser”的 755 权限,以便 Web 服务器能够遍历目录然后读取文件,假设文件具有 644 权限。

于 2014-12-01T20:14:30.500 回答