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_socket
Iの場合、最初の行 ( ) のみが変更されることに注意してください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