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

如何在 C 中的 linux 上打印 a 和 b 之间的 IPC 消息?

c_cpp Linux的下IPC通信之本地套接字

linux IPC socket

Linux进程间通信详解(最全)