我需要在 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=root
socket_bind 13:权限被拒绝
有趣的是,PHP 和 Dropboxd 都在同一个用户下运行。
注意:我尝试使用 PHP 的 fsockopen,但失败了(与“坏协议”有关)。再试一次,这一次它可以工作......直到我在下面得到同样的错误......
编辑:再一次,我知道以 root 身份运行是不好的,别管它,好吗?:)
编辑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
都是导致这个问题的原因吗?请注意,如果 I chmod 0777 iface_socket
,只有第一行 ( Access: (0600/srw-------)
) 会改变;但不是下面的其他 3 个。
编辑 3:我想知道,也许这个主题在 unix/unix-like 上会更好?目前,尚不清楚谁在这个问题上过错。
编辑 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