Передача файлов с использованием SFTP и PHP или сценария оболочки / терминала - PullRequest
2 голосов
/ 23 февраля 2010

Мне нужно написать скрипт, который запускается как задание cron каждую ночь, который передает некоторые файлы отчетов через sftp на другой сервер.

Файлы отчетов создаются каждую ночь с использованием другого cron в формате 'support_ [date] .csv' & 'download_ [date] .csv'.

Мне интересно, есть ли у вас указания относительно того, как сделать следующее:

  1. Найти 2 файла, созданные в последний [дата]
  2. Скопируйте эти файлы на другой сервер, используя SFTP

Я пробовал несколько сценариев PHP, использующих расширение ssh2, но безрезультатно. Есть ли способ сделать это с помощью сценария оболочки? Честно говоря, это не то, с чем я хорошо знаком (следовательно, сначала иду по пути PHP)

Это был один из моих PHP-скриптов, который не работал:

$src = 'test.csv';

$filename = 'test.csv';
$dest = '/destination_directory_on_server/'.$filename;

$connection = ssh2_connect('example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

// Create SFTP session
$sftp = ssh2_sftp($connection);

$sftpStream = fopen('ssh2.sftp://'.$sftp.$dest, 'w');

try {

            if (!$sftpStream) {
                throw new Exception("Could not open remote file: $dest<br>");
            }

            $data_to_send = file_get_contents($src);

            if ($data_to_send === false) {
                throw new Exception("Could not open local file: $src.<br>");
            }

            if (fwrite($sftpStream, $data_to_send) === false) {
                throw new Exception("Could not send data from file: $src.<br>");
            } else {
                //Upload was successful, post-upload actions go here...
            }

            fclose($sftpStream);

        } catch (Exception $e) {

            //error_log('Exception: ' . $e->getMessage());
           echo 'Exception: ' . $e->getMessage();
            if($sftpStream) {fclose($sftpStream);}

        }

Это были сообщения об ошибках, которые я получил:

Предупреждение: fopen () [function.fopen]: URL доступ к файлу отключен на сервере конфигурация в /path_to_script/sftp-test.php на линии 17

Предупреждение: fopen (ssh2.sftp: // ID ресурса

3 / destination_directory_on_server / test.csv)

[function.fopen]: не удалось открыть поток: не может быть подходящей обертки находится в /path_to_script/sftp-test.php в строке 17 Исключение: не удалось открыть удаленный файл: /destination_directory_on_server/test.csv

Ответы [ 6 ]

3 голосов
/ 23 февраля 2010

используя терминал, чтобы найти последнюю дату вашего файла, вы можете использовать ls -1tr. Затем используйте scp (не sftp) для копирования / передачи файлов поверх пример,

#!/bin/bash
latest_download=$(ls -1tr download*csv | tail -1)
latest_support=$(ls -1tr support*csv | tail -1)
scp $latest_download user@somehost.com:somedir  # syntax from memory, check man page for correct syntax
scp $latest_support user@somehost.com:somedir

проверьте man-страницу scp на предмет использования

2 голосов
/ 24 февраля 2010

Muchhos слава ghostdog74! Удалось заставить это работать, но с помощью sftp.

Сначала мне удалось настроить аутентификацию по ключу, затем частично с помощью скрипта ghostdog74 я сделал это, и это сработало отлично!

cd /directorywithfilesin
latest_download=$(ls -1tr download* | tail -1)
latest_support=$(ls -1tr support* | tail -1)
sftp username@example.com <<EOF
cd /dir_to_copy_to
put $latest_download
put $latest_support
EOF

Спасибо!

1 голос
/ 25 февраля 2011

Среди других проблем, связанных с методом ghostdog74, является то, что он непереносим. Я рекомендую использовать phpseclib, чистую реализацию PHP SFTP .

0 голосов
/ 28 января 2019

Попробуйте следующим образом (Shell)

SFTP=<sftp path>
KEY_FILE=<your key>
USERNAME=<remote username>
SERVER =<remote server>
REMOTE_DIR=<remote location>
APP_HOME =<App location>
FILENAME=<file name>

${SFTP} -o IdentityFile=${KEY_FILE} ${USERNAME}@${SERVER} <<_COMMAND
lcd ${APP_HOME}
cd ${REMOTE_DIR}
put ${FILENAME}
bye
_COMMAND
0 голосов
/ 23 февраля 2010

Это не будет работать с PHP с вашего сервера, потому что ваш php.ini имеет отключенные удаленные оболочки

allow_url_fopen логический

Этот параметр включает fopen-упаковщики с поддержкой URL-адреса, которые разрешают доступ к объекту URL, например, к файлам. Оболочки по умолчанию предназначены для доступа к удаленным файлам по протоколу ftp или http, некоторые расширения, такие как zlib, могут регистрировать дополнительные оболочки.

Примечание. Этот параметр можно установить только в php.ini по соображениям безопасности.

Однако вы можете просто позволить своему заданию cron вызывать сценарий оболочки, который использует sftp или rsync напрямую. Вам не нужно делать это с PHP.

Я голосую, чтобы переместить это в ServerFault, чтобы получить лучшую поддержку сценариев оболочки.

0 голосов
/ 23 февраля 2010

Ответ тут же, в сообщении об ошибке:

Предупреждение: fopen () [function.fopen]: доступ к файлам URL отключен в конфигурации сервера

означает, что доступ к файлу через упаковщики URL отключен в конфигурации сервера.

Проверьте настройки PHP, особенно allow_url_fopen . В документации PHP сказано: «Этот параметр можно установить только в php.ini по соображениям безопасности», поэтому проверьте его там.

См. Также fopen : "Если PHP решил, что в имени файла указан зарегистрированный протокол, и этот протокол зарегистрирован в качестве сетевого URL, PHP проверит, чтобы убедиться, что allow_url_fopen включен. Если он включен выключено, PHP выдаст предупреждение, и вызов fopen не удастся. " Насколько я могу судить, это именно то, что там происходит.

Если вы не можете или не хотите включать allow_url_fopen, у вас все еще есть несколько вариантов:

  • Позвоните в SFTP напрямую
  • смонтировать общий ресурс с помощью sshfs, а затем использовать его как обычную папку
...