PHP 和 Linux IPC 套接字(和 Dropbox)
Posted
技术标签:
【中文标题】PHP 和 Linux IPC 套接字(和 Dropbox)【英文标题】:PHP and Linux IPC sockets (and Dropbox) 【发布时间】:2011-03-06 21:55:50 【问题描述】:我需要获取 Dropbox 在 linux 上的状态。
这是通过使用 unix 套接字文件作为 IPC 与 Dropbox 交互来完成的。
目前,有一个Python script 可以执行此操作。
到目前为止我已经得到了这个代码:
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
都是导致此问题的原因吗?请注意,如果我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
【问题讨论】:
【参考方案1】:在 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 没有运行!”输出。在您的情况下,您应该能够在 PHP 中以您认为合适的方式操作 Dropbox。就我个人而言,我将 Dropbox 作为受限用户运行,而不是我的超级用户。使用组,您可以安全地随意链接文件夹,并强制执行文件权限。
<?php
$output = shell_exec('dropbox status');
echo "<pre>$output</pre>";
Dropbox 没有运行!
【讨论】:
【参考方案2】:一个可行的选择。 试试这个:
<?php
$output = shell_exec("ps aux | grep '[d]ropbox'");
echo "<pre>$output</pre>";
【讨论】:
以上是关于PHP 和 Linux IPC 套接字(和 Dropbox)的主要内容,如果未能解决你的问题,请参考以下文章
Windows IPC 模拟 Linux Unix 域和 Netlink 套接字
IPC:Qt 和 MONO 进程之间的通信(在 linux 上)