Форум → Программирование → PHP для идиотов → Сраный FTP (part 2)
Сраный FTP (part 2)
-
Продолжение http://pyha.ru/forum/topic/8526
Дядя Дуд оказался прав, видимо проблема таки в этом http://stackoverflow.com/questions/9574104/ftp-reports-644-on-file-but-is-writablefile-returns-false
Примаунтить диск, конечно можно, но уж очень много маунтить придется. Другой сраный пазл заключается вот в чём:
На сервере поднят FTP, есть обычный скрипт, который стучится на свой же FTP, и запрашивает права на файл (is_writable('ftp://user:pass@mysite/httpd')). Бочина в том, что если этот файл запускаешь из консоли (от root-а) эта хрень работает, от апача нет! Добавил пользователей user, ftp, www-data в группы ftp, www-data, один хрен никаких результатов. Обзваонил админов, они тоже в потерях, ведь по сути, реакция должна быть на user:pass а не на пользователя, запустившего скрипт. Может быть у кого есть any ideas? -
Март 5, 2014, 2:45 п.п., спустя 7 минут 44 секунды
реакция должна быть на user:pass а не на пользователя, запустившего скрипт. Может быть у кого есть any ideas?
Эрекция. вот тебе и "грабле-похапэ".
Сапожник без сапог -
Март 5, 2014, 3:23 п.п., спустя 38 минут 21 секунду
я думаю ты не решишь эту проблему. я бы на твоем месте уже альтернативы поискал)))
банально оптимальный в ситуациия "нихочу ничо писать" это конечно mount какой либо сетевой фс на папку и работа с ней.
Спустя 93 сек.
либо можно быть охуевшим хитровыебаным гавнюком))))) и черезPHP: stream_wrapper_register - Manual [th1.php.net] заимплементить свой ftp wrapper :Dну это я считаю классикой и пойдешь ли ты на это - тебе решать)))
Спустя 144 сек.
если пойдешь по этому пути, классец покажи, ну так, чисто поржать ))PHP: stream_wrapper_register - Manual
th1.php.net
Сапожник без сапог -
Март 5, 2014, 3:30 п.п., спустя 6 минут 48 секунд
О блять, Дуд, тебя точно донатить надо, хотя бы за то, что вьехал в проблему :) Ковырялся уже, сука, везде. Cli и apache конфиги одинаковые. Отпишусь чо и как, если победю -
Март 5, 2014, 3:33 п.п., спустя 3 минуты 31 секунду
@Josh, давай, но я бы по пути "классики" пошел))) чтобы еще чтото запомнить среди этих серых будней
Сапожник без сапог -
-
Март 14, 2014, 3 п.п., спустя 1 день 20 часов 36 минут
вспомнил. Забыл отписатся. Да. Написал врапер. Криво, но исходя из ситуации и таска. обращаюсь теперь так: fopen('ttp://user:[email protected]'). Там, где ftp работает корректно оставил, так как есть;function stream_open($path, $mode, $options, &$opened_path) {
$stream_options = array('ftp' => array('overwrite' => true));
$stream_context = stream_context_create($stream_options);
$this->handle = fopen(str_replace('ttp://', 'ftp://', $path), $mode, $options, $stream_context);
$url = parse_url($path);
$this->path = $path;
$this->conn_id = ftp_connect($url['host']);
$this->url_path = $url['path'];
$this->resource = ftp_login($this->conn_id, $url['user'], $url['pass']);
return is_resource($this->conn_id);
}public function stream_write($string){
return fwrite($this->handle, $string);
}function unlink($path){
return unlink(str_replace('ttp://', 'ftp://', $path));
}
Основная проблема это url_stat, которая некорректно отрабатывала, сначала прицепил заглушку, она отдавала всегда 777 (0040777 и 0777), при чём надо было понимать где dir, а где нет, потому как is_dir, использующий эту функцию так же криво работал. В итоге, решил ходить по http, и спрашивать права на удаленном сервере. Права апача, или нжинкса, сервере короче, конечно должнв быть такие же как и у фтп юзера:function url_stat($path) {
$url = parse_url($path);
$stat_path = 'http://' . $url['host'] . '/fstat/?p=' . $url['path'] ;
$stat = file_get_contents($stat_path);
$stat = unserialize($stat);
return $stat;
/*$stat = @stat(str_replace('ttp://', 'ftp://', $path));
if($stat){
$mode = $stat['mode'];
if($mode == 16804){//dir
$mode = 0040777;
} else {
$mode = 0777;
}
$stat['mode'] = $mode;
return $stat;
} else {
return false;
}
//$perms = fileperms(str_replace('ttp://', 'ftp://', $path));
$mode = 0777; // There are no protections on this, so all writable.
$mode = 0040777; // There are no protections on this, so all writable.
$return = array(
'dev' => 1,
'ino' => 1,
'mode' => $mode,
'nlink' => 0,
'uid' => 0,
'gid' => 0,
'rdev' => 0,
'size' => 0,
'atime' => 0,
'mtime' => 0,
'ctime' => 0,
'blksize' => 0,
'blocks' => 0,
);
return $return;*/
}
камменты оставил, возможно кому пригодятся
и на сервере соответственно:$path = isset($_GET['p']) ? $_GET['p'] : null;
$result = false;
if($path){
$file = trim(trim(DOCROOT_PATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . trim($path, DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR);
if(file_exists($file)){
$result = stat($file);
}
}
echo serialize($result);
die();
Весь код ложить в готовые решения, да и сюда, думаю смысла нет: писал быстро, и под конкретную цель.Спустя 136 сек.
И да: ещё раз спасибо Дуду, за то, что показал пальцем куда смотреть -
Март 14, 2014, 3:03 п.п., спустя 2 минуты 50 секунд
@Josh, ебать мой хуй))
ну и костыль вышел, но это тру! харкор в самом непревзойденном виде, как я люблю! :-)
красава, плюс не могу поставить, джангодевы проебали карму гдето. хоть вмз шли)
Спустя 38 сек.
а так, вполне себе хороший лайфхак с переопределением stream'а на мой взгляд. когда "back box" трогать нельзя остальной. с капелькой интриги)Сапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!