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=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
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 没有运行!” 输出。在您的情况下,您应该能够在 PHP 中以您认为合适的方式操作 Dropbox。就我个人而言,我将 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 回答