Php копирование файла с другого сервера

Обновлено: 06.07.2024

С помощью функции file_get_contents() можно получить содержимое файла:

Также мы можем получить html-код какой-либо страницы в интернете:

Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.

Чтение файла: file()

Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.

Создадим в корне сайта файл data.txt со следующим содержимым:

Теперь запустим скрипт index.php со следующим кодом:

При запуске этого скрипта мы получим в браузере:

Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.

Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :

Теперь у всех строк будет по 5 символов.

Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES :

Разумеется, мы можем передать сразу две константы:

Создание файла и запись в файл: file_put_contents()

Функция file_put_contents() позволяет создать файл и заполнить его данными.

Первым параметром функция принимает путь к файлу, вторым - строку с данными. Для создания пустого файла нужно передать вторым параметром пустую строку.

Если файла не существует - он будет создан. Если существует - данные в файле будут перезаписаны.

Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :

Также вторым параметром можно передать массив:

Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:

Создание папки или структуры папок

Создать папку можно с помощью функции mkdir() (make directory):

Вторым параметром указываются права доступа к файлу в виде восьмеричного числа, по-умолчанию это 0777 , что означает самые широкие права. Для Windows этот аргумент игнорируется.

Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :

Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :

Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:

Права доступа - это отдельная объёмная тема, поэтому сейчас мы её пока рассматривать не будем.

Проверка существования файла или папки

Проверить существование папки или файла можно с помощью функции file_exists() :

Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :

Проверка прав доступа

Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:

Копирование, перенос и удаление файла

Для удаления файлов используется функция unlink() :

Чтобы скопировать файл, используем функцию copy() :

Для переименования и переноса файла в другую папку используется функция rename() :

Работа с файлами с помощью fopen()

Функций file() , file_get_contents() и file_put_contents() достаточно для решения большинства задач, связанных с управлением файлами.

Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.

Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :

Функция fopen() возвращает так называемый лескриптор. Это ссылка, указатель на файл, его мы будем передавать в другие функции. Кстати, тип данных этого дескриптора - resource .

Первым параметром мы передаём путь к файлу, вторым - модификатор доступа к файлу. Ниже перечислены наиболее популярные модификаторы:

  • r - открытие для чтения, указатель переходит в начало файла.
  • r+ - открытие для чтения и записи, указатель переходит в начало файла.
  • w - открытие для записи, указатель переходит в начало файла. Если файла нет - создаётся, если есть - очищается от данных.
  • w+ - открытие для чтения и записи, в остальном аналогичен w .
  • a - открытие для записи, указатель переходит в конец файла. Если файла нет - создаётся.
  • a+ - открытие для чтения и записи, в остальном аналогичен a .
  • x - создание и открытие для записи, указатель переходит в начало файла. Если файл существует - PHP покажет ошибку.
  • x+ - создание и открытие для чтения и записи, в остальном аналогичен x .

Указатель - это нечто вроде курсора. Вы можете переместить его в любое место файла, чтобы добавить или отредактировать определённые данные.

Для записи данных в файл существует функция fwrite() . Давайте попробуем создать файл и записать в него какие-нибудь данные:

Заметьте, из-за модификатора w при каждом запуске скрипта данные в файле стираются и добавляются заново. Если модификатор заменить на a , данные будут не перезаписываться, а добавляться в конец файла.

Для построчного чтения файла используется функция fgets() :

При каждом запуске fgets получает следующую строку и возвращает её в $line . Вторым параметром передаётся максимальная длина строки. Это означает, что если строка слишком длинная, она будет обрезана.

Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.

Этичный хакинг и тестирование на проникновение, информационная безопасность

Это небольшая шпаргалка, как скопировать файлы с уже скомпрометированной системы. Типичные ситуации:

  • на веб сайте найдена уязвимость Удалённое выполнение кода
  • получены учётные данные пользователя, позволяющие подключиться по SSH (например, с помощью брут-форса)

Я перечислю несколько способов, как скопировать файл с сервера, я не сомневаюсь, что вы сможете придумать ещё столько же или больше (кстати, делитесь ими в комментариях), выбор конкретного способа зависит от условий и от личных предпочтений.

Условия могут быть разные:

1. cat + копирование с экрана/браузера

Простейший способ, с помощью команды cat выводится содержимое файла. Он подходит только для текстовых файлов. При выполнении команды по SSH, содержимое файла выводится в консоли, при выполнении через уязвимое веб-приложение, содержимое файла выводится на странице сайта:


Если делаете через выполнение команд в веб-браузере, то для нормального отображения откройте исходный код веб-страницы:


2. base64 + копирование с экрана/браузера

Этот способ похож на предыдущий, его можно применять для скачивания бинарных файлов, если другой возможности нет.

Для понимания сути, изучите следующие команды:

Содержимое исполнимого файла /usr/bin/ls (команда ls) кодируется в Base64 и сохраняется в файл ls.txt:

Можно посмотреть, что в файле ls.txt размещён текст, который можно скопировать/вставить:

Теперь этот текст декодируем и сохраняем в файл ls.bin:

С помощью команды chmod делаем файл ls.bin исполнимым:

Проверяем работоспособность этого файла:

Суть в том, что с помощью base64 можно копированием-вставкой передавать бинарные файлы без возможности выгрузить их с сервера другим способом.

3. Помещение файла в директорию сайта и скачивание с веб-сервера

Допустим, папка сайта это /var/www/html/, тогда копируем нужный нам файл в неё следующей командой:

Чтобы узнать текущую папку, где выполняется уязвимый скрипт, выполните команду pwd:

Типичные папки с сайтами:

/etc/apache2/ — директория с настройками веб-сервера (когда служба называется apache2 — то есть в таких системах как Debian и производных)

Если неизвестно где папки сайтов, то нужно смотреть конфигурационные файлы Apache, там же можно узнать адрес сайта, если вдруг вы его не знаете (такое может быть, если сервер скомпрометирован по SSH):

Чтобы посмотреть, запущен ли вообще веб-сервер:

Если файлов много, то их можно заархивировать:

Если программа zip недоступна, то используйте tar:

Или другие программы для архивации, для этого смотрите также «Работа с архивами в Linux».

4. cURL + POST

Этот способ не требует наличия веб-сервера и, по идее, должен работать также и на Windows, поскольку там cURL предустановлена по умолчанию.

Суть очень проста. Каждый из нас множество раз выгружал файлы с компьютера на сайт, например, фотографию для профиля или файл в файлообменник. Мы используем веб-браузер, который методом POST отправляет файл. Вместо браузера можно отправлять файл с помощью команды curl, которая также умеет использовать метод POST.

На сервере создайте файл uploader.php:

С компьютера, с которого нужно выгрузить файл, запустите команду вида:

Обратите внимание на символ @ - он нужен для того, чтобы параметру file было присвоено не значение строки «/путь/до/файла», а содержимое того самого файла, который находится по пути /путь/до/файла.

Если у вас серый IP адрес (к которому невозможно подключиться из Интернета), то в этой ситуации поможет программа ngrok. То есть в предыдущей команды вместо СЕРВЕР/uploader.php можно указать домен третьего уровня ngrok, от которого идёт туннель к вашему локальному веб-серверу.

5. ngrok

Программа ngrok отсутствует по умолчанию, поэтому нужно начать с установки:

Не забудьте заменить ВАШ_AUTHTOKEN на настоящее значение.

Эта долгая установка точно стоит своих усилий, дело в том, что теперь можно сделать сетевой абсолютно ЛЮБУЮ папку на компьютере Linux! Например:

6. Встроенный сервер PHP

У PHP есть встроенный веб сервер. Сам PHP довольно часто присутствует на компьютерах Linux, а если это веб-сервер, то присутствует практически всегда.

Нужно запускать командой вида:

В качестве IP нужно указать IP адрес удалённого компьютера, узнать его можно командой:

PORT можно указать любой, но для использования портов ниже 1024 нужны привилегии суперпользователя.

7. SSH и перенаправление вывода на текущую систему

SSH можно использовать для копирования текстовых файлов:

А также и для копирования бинарных файлов:

8. scp

Программа scp является частью SSH и предназначена специально для копирования файлов в любом направлении. То есть если у вас есть возможность подключиться по SSH, то намного удобнее воспользоваться scp.

Вид команды для копирования с удалённого компьютера на локальный компьютер:

9. Сетевая файловая система SSHFS

Если у вас есть возможность подключиться по SSH, то вы можете смонтировать удалённую файловую систему как свою локальную командой вида:

10. Ncat, Netcat, nc

На HOST1 выполните:

На HOST1 запустите:

И на HOST2 выполните:

11. Бэкдоры

Самый распространённый вариант для веб-серверов. Можно скачать бэкдор с веб-интерфейсом:

А можно использовать более привычные шеллы с обфускацией и сокрытием передаваемых запросов от логов веб-сервера.

Больше подробностей смотрите по ссылкам:

Заключение

Конечно, способов скачать файл с удалённого компьютера через шелл или уязвимость веб сайта намного больше. Пишите в комментариях свои любимые способы!

пример использования: пользователь хочет добавить изображение в свой профиль. Изображение уже существует в интернете, и пользователь предоставляет прямой URL-адрес. Я не хочу, чтобы hotlink изображение, но импортировать и обслуживать из моего домена.

Если у вас есть PHP5 и HTTP stream wrapper включен на вашем сервере, это невероятно просто скопировать его в локальный файл:

Это будет заботиться о любых конвейеризация и т. д. это необходимо. Если вам нужно предоставить некоторые параметры HTTP, вы можете предоставить третий параметр "контекст потока".

PHP имеет встроенную функцию file_get_contents (), которая считывает содержимое файла в строку.

//хранить в файловой системе. $fp = fopen ("/location/to/save/image.jpg", " w"); fwrite($fp, $content); fclose($fp); ?> Если вы хотите сохранить файл в базе данных, просто используйте переменную $content и не сохраняйте файл на диск.

вот самый простой способ:

но если вы делаете много и много этого (или ваш хост блокирует доступ к файлам удаленных систем), рассмотрите возможность использования CURL, который более эффективен, мягко быстрее и доступен на более общих хостах.

вы также можете изменить агента пользователя, чтобы выглядеть как рабочий стол, а не бот!

в обоих случаях вы можете передать его через GD, чтобы убедиться, что это действительно изображение.

Это очень просто с помощью функции file_get_contents. Просто укажите URL в качестве первого параметра.

  • Windows XP Пакет обновления 3
  • Apache 2.2.12 (работает как Служба)
  • PHP 5.3.0 (API20090626, TS, VC6) (настроен как модуль apache)

используйте запрос GET, чтобы загрузить изображение и сохранить его в веб-доступном каталоге на вашем сервере.

Как вы используете PHP, вы можете использовать curl для загрузки файлов с другого сервера.

поскольку вы отметили свой вопрос "php", я предполагаю, что вы используете php на своем сервере. Лучше всего, если вы управляете своим собственным веб-сервером, а затем компилируете cURL в php. Это позволит вашему веб-серверу выполнять запросы к другим веб-серверам. Это может быть довольно опасно с точки зрения безопасности, поэтому большинство основных поставщиков веб-хостинга не включена эта опция.

здесь страница PHP на человека с помощью curl. В комментариях вы можете найти пример, который загрузка и файл изображения.

Если вы не хотите использовать libcurl, вы можете закодировать что-то с помощью fsockopen. Это встроено в php (но может быть отключено на вашем Хосте) и может напрямую читать и записывать в сокеты. Смотрите примеры на странице fsockopen man.

Любая помощь будет очень признательна.

4 ответа

Я хочу написать один скрипт php, который будет копировать один конкретный файл с одного веб-сервера( linux ) на другой( linux ).

Мне любопытно, есть ли возможность в PHP скопировать ключ/значение с одного сервера memcached непосредственно на другой с помощью модуля Memcached? Разрешены ли вообще соединения с 2-мя разными серверами одновременно? Заранее спасибо!

Есть еще 2 возможных способа, которые можно использовать для копирования ваших файлов с другого сервера.

-Один из них-удалить файл .htaccess из example.com или разрешить доступ ко всем файлам(изменив файл .htaccess). -Access/Read эти файлы через их соответствующие URLs и сохраните эти файлы с помощью методов "file_get_contents()" и "file_put_contents()". Но этот подход сделает все файлы доступными и для других людей.

Можно ли скопировать список sharepoint с одного сервера на другой? Итак, у меня есть сервер с запущенным сайтом 1, я хочу скопировать список с ServerA-Site1 на ServerB-Site1. Я видел множество статей на SO, чтобы копировать их с одного сайта на другой, пока сайты находятся на одном сервере. Я уже.

Каков наилучший способ без установки каких-либо новых материалов или использования FTP для перемещения образа с одного сервера на другой? как бы вы этого добились ? Можете ли вы использовать php CURL , чтобы взять файл, загруженный на webserver, и переместить его на другой сервер? Можете ли вы.

N.B. Если вы хотите, чтобы это скопировало весь веб-сайт, вы должны поместить его в for loop

Вы можете обмениваться файлами между серверами также с помощью метода zip. Вы владеете обоими серверами, поэтому у вас не должно быть проблем с безопасностью.

На сервере, на котором размещен нужный файл или папка, создайте сценарий php и создайте для него задание cron. Пример кода ниже:

Создайте еще один сценарий php и задание cron на сервере, чтобы получить копию, как показано ниже:

Похожие вопросы:

У меня есть приложение java, которое копирует или перемещает кучу гига-файлов с одного сервера ftp на другой. В настоящее время он копирует файл с первого сервера fpt на локальный компьютер (где он.

Мы используем sharepoint 2007, у нас есть два сайта, оба сайта находятся на разных серверах. В соответствии с требованиями нам нужно копировать пользовательский список с одного сервера на другой.

Мне нужно скопировать текстовый файл с одного сервера на другой (оба сервера Linux). Как мне это сделать в Java?

Я хочу написать один скрипт php, который будет копировать один конкретный файл с одного веб-сервера( linux ) на другой( linux ).

Мне любопытно, есть ли возможность в PHP скопировать ключ/значение с одного сервера memcached непосредственно на другой с помощью модуля Memcached? Разрешены ли вообще соединения с 2-мя разными.

Можно ли скопировать список sharepoint с одного сервера на другой? Итак, у меня есть сервер с запущенным сайтом 1, я хочу скопировать список с ServerA-Site1 на ServerB-Site1. Я видел множество.

Каков наилучший способ без установки каких-либо новых материалов или использования FTP для перемещения образа с одного сервера на другой? как бы вы этого добились ? Можете ли вы использовать php.

Я пытаюсь скопировать файл с одного сервера на другой, чтобы он не просил меня ввести мою регистрационную информацию, и мне не нужно было бы хранить пароль явно в коде. Проблема в том, что он все.

Как скопировать индекс ES (v 5.x) с одного сервера на другой. у меня нет прав устанавливать какое-либо программное обеспечение на эту машину. есть ли лучшее решение для копирования индекса ? будет.

время от времени мне нужно перемещать базу данных с одного сервера (QA) на другой (производственный ) до сих пор я выполнял резервное копирование с одного сервера на другой, а затем восстанавливал.

Заранее извиняюсь если промазал с темой или тема повтор, однако поиском пользовался - ответа на свой вопрос не нашел. Уже второй день пытаюсь найти решение своей проблемы, прочитал 358 Мб форумов и мануалов, мозг взрывается, результат - отсутствует. Замечу, что знания в PHP чуть более, чем нулевые, мозга хватило лишь на то, чтобы собрать несколько примеров воедино и подкорректировать под собственные потребности.

Задача:
необходимо получить содержимое файла с удаленного сервера (данные в xml)

Суть проблемы:
на предыдущем хостинге все работало при помощи SimpleXML

Люди добрые, не проходите мимо! Помогите слабоумному. Какие есть еще способы для получения содержимого файла с удаленного сервера? __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Получить пользвателей удаленного сервера
Добрый день! Можно ли программным путем получить список windows пользователей удаленного сервера.

Получить данные из mySLQ с удаленного сервера
У меня на сайте есть база данных, подскажите как с ней работать? Можно пример? Нигде не нашел

Последняя возможность это fsockopen. Хотя раз cURL вырубили, то . скорее придётся общаться Вам с хостером.

Если вдруг кому понадобится, решил проблему при помощи следующей конструкции:

P.S. В данной конструкции локальный файл local-file.xml должен быть создан заранее, и иметь доступ на запись.

И опять нубский вопрос: как сделать так, что бы не было проверки на доступность файла для записи, в случае отсутствия файла он бы создавался, и главное - что бы файл очищался перед записью?

Добавлено через 22 минуты
Опять затупил, но искуплю свою вину и сам отвечу на свой вопрос:

Добавлено через 2 часа 1 минуту
Не совсем по теме, но возникла новая проблема..
На другом хостинге "For security reasons" запрещен exec(), и соответственно вышеупомянутая конструкция опять не работает. Зато на нем не запрещен fopen(). Попробовал сделать так:
Для вышеописанного случая Вам уже понадобится симулятор веб-браузера, вроде Snoopy.
Потому, что в первом посте я говорил о том, что в настройках сервера "allow_url_fopen=0", и по этому, URL в качестве имени фала в "file_get_contents()" использовать не получится.

Почему бы не использовать?

Потому, что в первом посте я говорил о том, что в настройках сервера "allow_url_fopen=0", и по этому, URL в качестве имени фала в "file_get_contents()" использовать не получится.

В .htaccess допиши

php_value allow_url_include on
php_value allow_url_fopen on

Warning: curl_exec() has been disabled for security reasons У вас очень странный хостер. Бегите от него, просто на всякий случай.

Ребята привет.
Интересует данная тема.
Перепровал массу варианта парсинга.
Но один сайт никак не хочет поддаваться, не хочет отдавать код.
Если сохраняю страницу ctrl + s - то все ок.
А если программными методами PHP - часть кода не отдает, там где наличие размеров. Даже wget пробовал. Нет.

Защита от парсинга стоит? Ничего понять не могу.

Загрузка файла с удаленного сервера
Нужно загрузить файл в временную папку и при загрузке писать загружено n из N мБ Как такое.


Как получить данные с БД или сделать дамп с удаленного сервера зная логин/пароль
Здравствуйте! Я полный ноль в базах данных, так что прошу меня простить если задаю глупый вопрос.

Получить содержимое файла (картинки)
здравствуйте, я ламер в ас и флеше, возникла такая задача: создать swf объект, который бы мог.

Получить содержимое заголовка PE - файла
Подскажите пожалуйста при каком открытии файла заполняются структуры, описывающие заголовок.

Читайте также: