3

这是来自 raspberrypi.stackexchange.com 的转贴问题。当我试图在树莓派上的 python 上工作时,因为它不涉及任何特定于 pi 的东西,所以我在这里发帖的人建议这样做。原帖在这里


我正在尝试制作一个 web ui 来更改 rapsberry pi 中的日期,但我一直收到 256 的返回码。

目前我所拥有的是这样的:

网页 -> 向 python 脚本提交 ajax 请求 python 检查什么类型的命令(在这种情况下是时间/日期命令)并将字符串拼凑在一起,如下所示:

sudo date --set="20130901 20:10"

并将其存储在一个变量commandString中。然后python去:

os.system(commandString)

并且返回值一直传递到打印出来的 web ui。

我目前也将commandString值返回到 web ui 以验证它,它看起来没问题。

问题是每次测试时,我都会不断返回 256 作为错误返回码。树莓派上的日期当然不会改变,因为我在之前和之后手动检查它。

但是,如果我在树莓派上手动进入 python 并尝试:

commandString = 'sudo date --set="20130901 20:10"'
os.system(commandString)

它可以正常工作。如果我不尝试,sudo那么我也会得到 256 的返回值,所以我认为这可能是我的原始脚本的权限问题。我试过这个链接来检查我的脚本的权限,它似乎没问题?(os.geteuid()为 0)

如果重要的话,我正在使用 lighttpd 和 fastcgi 从 web ui 运行 python。我的 lighttpd 配置当前是:

fastcgi.server = (
    ".py" => (
    "python-fcgi" => (
    "socket" => "/tmp/fastcgi.python.socket",
    "bin-path" => "/var/www/command.py",
    "check-local" => "disable",
    "max-procs" => 1)
    )
)

关于我所缺少的任何想法?


在原始帖子中,还建议我尝试以下操作:

echo <password> | sudo -S date --set="20130829 02:02

虽然像这样输入我的 root 密码可能不是一个好主意,但我尝试了它并得到了相同的结果:它在终端/shell 和 python 解释器中工作时有效,但不能通过 web ui 到 python。

4

2 回答 2

0

更新:或者可能只是/usr/bin/sudo /bin/date ...用来确保找到命令。

试试这个:

import subprocess

p = subprocess.Popen('sudo -S date --set ...', shell=True, stdin=subprocess.PIPE)
p.communicate(input='<your password>')

这是启动子进程(通过 shell)并向其发送一些输入的更合适的方法。

如果你还需要读取进程的输出,那么例如:

p = subprocess.Popen('sudo -S date --set ...', shell=True,
                     stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate(input='<your password>')
print "\n".join("out: " + x for x in out.split('\n'))
print "\n".join("err: " + x for x in err.split('\n'))

...或者只是获取out和/或的内容err并解析它们。

于 2013-10-02T10:03:07.683 回答
0

检查环境是否可以在搜索路径上找到sudo和(或您要执行的任何其他命令)。date

您还可以使用绝对路径sudo和其他命令,例如/usr/sbin/sudo

于 2013-10-02T10:09:26.093 回答