Мне нужно получить статус 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