2

Linux で Dropbox のステータスを取得する必要があります。

これは、UNIX ソケット ファイルを IPC として使用して Dropbox と対話することによって行われます。

現在、これを行うためのPython スクリプトが存在します。

私はこれまでにこのコードを持っています:

echo 'usr='. get_current_user().'<br/>';

$address='/root/.dropbox/iface_socket';
$socket=socket_create(AF_UNIX,SOCK_STREAM,0);
if(!socket_connect($socket,$address))
    die('socket_connect '.socket_last_error().': '.socket_strerror(socket_last_error()));

上記は、私が何をしたいのかを知っているという点で機能しますが、次のエラー/出力で失敗します:

usr=ルート

socket_bind 13: 権限が拒否されました

PHP と Dropboxd の両方が同じユーザーで実行されていることに注意してください。

注: PHP の fsockopen を使用しようとしましたが、失敗しました (「不適切なプロトコル」と関係があります)。もう一度試してみましたが、今回はうまくいきました....以下に同じエラーが表示されるまで...

編集:繰り返しますが、ルートとして実行するのは悪いことだと知っています。:)

編集 2:前に述べたように、PHP、Apache、Dropbox、およびこのソケット ファイルはすべて、ユーザー "root"、グループ "root" の下にあります。ただし、stat の下でソケットを実行すると、次のようになります。

[root@cov .dropbox]# stat iface_socket
  File: `iface_socket'
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: 7dh/125d        Inode: 255754311   Links: 1
Access: (0600/srw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-03-06 17:10:08.000000000 -0600
Modify: 2011-03-06 17:10:08.000000000 -0600
Change: 2011-03-06 17:10:08.000000000 -0600

これらすべて-0600がこの問題の原因ではないでしょうか? chmod 0777 iface_socketIの場合、最初の行 ( ) のみが変更されることに注意してくださいAccess: (0600/srw-------)。下の他の 3 つではありません。

編集 3:疑問に思っていたのですが、このトピックは unix/unix ライクに移動した方がよいのではないでしょうか? 現時点では、この問題で誰が責任を負っているのかは明らかではありません。

編集 4: 次のように strace を介して PHP スクリプトを実行するだけです。

strace php -nef /var/www/html/index.php

出力からの関連行:

socket(PF_FILE, SOCK_STREAM, 0)         = 3
fcntl(3, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK)    = 0
connect(3, {sa_family=AF_FILE, path="/root/.dropbox/iface_socket"...}, 29) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
close(3)                                = 0
4

2 に答える 2

0

Apache が Dropbox と同じユーザーで実行されているというまれなケースでは、ターミナルから通常行うように、Python コマンドライン インターフェイス (Debian) /usr/bin/dropbox を使用します。

root@DevServer1:~# dropbox help
Dropbox command-line interface

commands:

Note: use dropbox help <command> to view usage for a specific command.

 status       get current status of the dropboxd
 help         provide help
 puburl       get public url of a file in your dropbox
 stop         stop dropboxd
 running      return whether dropbox is running
 start        start dropboxd
 filestatus   get current sync status of one or more files
 ls           list directory contents with current sync status
 autostart    automatically start dropbox at login
 exclude      ignores/excludes a directory from syncing

フロント スクリプトは、Dropbox を実行しているユーザーのみが効果的に使用できます。それ以外の場合は、「Dropbox is not running!」というメッセージが表示されるはずです。出力。あなたの場合、PHP内から適切と思われる方法でドロップボックスを操作できるはずです。個人的には、スーパーユーザー以外の制限付きユーザーとして Dropbox を実行しています。グループを使用すると、自由にフォルダーを安全にリンクでき、ファイルのアクセス許可が適用されます。

<?php
$output = shell_exec('dropbox status');
echo "<pre>$output</pre>";

Dropbox が実行されていません。

于 2011-04-26T06:05:47.833 に答える
0

実行可能な代替手段。代わりにこれを試してください:

<?php
$output = shell_exec("ps aux | grep '[d]ropbox'");
echo "<pre>$output</pre>";
于 2014-05-04T06:02:12.703 に答える