3

これは、raspberrypi.stackexchange.com から再投稿された質問です。ラズベリーパイのpythonで何かを動作させようとしていますが、パイ固有のものは含まれていないため、代わりにここに投稿した人から提案されました。元の投稿はこちら.


rapsberry pi の日付を変更するための Web UI を作成しようとしていますが、リターン コード 256 が引き続き返されます。

現在、私が持っているものは次のようになります:

Web ページ -> ajax リクエストを python スクリプトに送信します。

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

変数に格納しますcommandString。次に、pythonは次のようになります。

os.system(commandString)

戻り値は、それが印刷される Web UI までずっと渡されます。

commandStringまた、現在、値を Web UIにも返して確認していますが、問題ないようです。

問題は、テストするたびにエラー リターン コードとして 256 が返されることです。もちろん、ラズベリーパイの日付は、手動で前後に確認しているため、変更されません。

ただし、raspberry pi で手動で 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

そのようにルートパスワードを入力するのはおそらく良い考えではありませんが、試してみたところ同じ結果が得られました。ターミナル/シェルおよびPythonインタープリター内で実行すると機能しますが、Web UIからPythonへは機能しません。

4

2 に答える 2

0

sudoand date(または実行したい他のコマンド) が検索パス上で実際に見つかるかどうか、環境を確認してください。

sudoおよび他のコマンドへの絶対パスを使用することもできます。/usr/sbin/sudo

于 2013-10-02T10:09:26.093 に答える
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>')

これは、(シェル経由で) サブプロセスを起動し、入力を送信するより適切な方法です。

プロセスの出力も読み取る必要がある場合は、たとえば次のようになります。

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'))

...または単にoutand/orの内容を取得してerr解析します。

于 2013-10-02T10:03:07.683 に答える