PHP и Linux IPC сокеты (и Dropbox) - PullRequest
2 голосов
/ 07 марта 2011

Мне нужно получить статус Dropbox на Linux.

Это достигается взаимодействием с Dropbox с использованием файла сокета Unix в качестве IPC.

В настоящее время для этого существует скрипт 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, но не смог (что-то делать с «плохим протоколом»). Попробовал еще раз, и на этот раз он работает .... пока я не получу ту же ошибку ниже ...

Редактировать: Опять же, я знаю, что запуск от имени 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: Просто запустил скрипт PHP через strace, как это:

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2014

Жизнеспособная альтернатива. попробуйте это вместо:

<code><?php
$output = shell_exec("ps aux | grep '[d]ropbox'");
echo "<pre>$output
";
0 голосов
/ 26 апреля 2011

В редком случае, когда Apache работает под тем же пользователем, что и Dropbox, я просто использовал бы интерфейс командной строки python (Debian) / usr / bin / dropbox, как обычно это делается из терминала.*

Фронт-скрипт может эффективно использоваться только пользователем, под которым запущен Dropbox.Все остальные должны получить «Dropbox не работает!»выход.В вашем случае вы должны иметь возможность манипулировать Dropbox так, как считаете нужным изнутри PHP.Лично я запускаю Dropbox как пользователь с ограниченными правами, а не мой суперпользователь.Используя группы, вы можете безопасно ссылаться на папки по желанию, и права доступа к файлам будут применены.

<code><?php
$output = shell_exec('dropbox status');
echo "<pre>$output
";

Dropbox не работает!

...