SFTP ve ya PHP veya kabuk / terminal komut dosyası kullanarak dosyaları aktarmak

5 Cevap php

Ben bir cron işi başka bir sunucuya SFTP yoluyla bazı rapor dosyaları aktarır her gece olarak çalışan bir komut dosyası yazmak gerekiyor.

Rapor dosyaları formatta başka bir cron kullanarak her gece oluşturulan 'Support_ [tarih]. Csv' & 'Download_ [tarih]. Csv'.

Eğer aşağıdakilerin nasıl herhangi bir işaretçiler olsaydı ben merak ediyorum:

  1. Son [tarih] oluşturulan 2 dosyaları bulun
  2. SFTP kullanarak başka bir sunucuya bu dosyaları kopyalamak

Ben ssh2 uzantısını kullanan birkaç PHP betikleri çalıştı, ama boşuna ettik. Bir kabuk komut dosyası kullanarak bunu yapmanın bir yolu var mı? Ben (dolayısıyla başlangıçta PHP rota aşağı gidiyor) dürüst olmak ile derece aşina olduğum bir şey değil

Bu işe yaramadı benim PHP biriydi:

$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);}

        }

Bu bende hata iletileri idi:

Warning: fopen() [function.fopen]: URL file-access is disabled in the server configuration in /path_to_script/sftp-test.php on line 17

Warning: fopen (ssh2.sftp :/ / Resource id

3/destination_directory_on_server/test.csv)

[function.fopen]: failed to open stream: no suitable wrapper could be found in /path_to_script/sftp-test.php on line 17 Exception: Could not open remote file: /destination_directory_on_server/test.csv

5 Cevap

Muchos ghostdog74 için şeref! Bu çalışma almak için, ama sftp ile başardı.

Öncelikle ben daha sonra kısmen ghostdog74 senaryosunu ben yaptım kullanarak, anahtar doğrulaması kurmak başardı ve o amele mükemmel!

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

Teşekkürler!

using the terminal to find latest date of your file, you can use ls -1tr . Then use scp (not sftp) to copy/transfer files over example,

#!/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

kullanım için SCP man sayfasına bakın

Ghostdog74 yöntemi ile diğer sorunlar arasında olmayan taşınabilir olmasıdır. Benim tavsiye phpseclib, bir pure PHP SFTP implementation kullanmak olacaktır.

Php.ini çünkü bu sunucudan PHP çalışmak olmaz disabled remote wrappers

allow_url_fopen boolean

Bu seçenek, dosyaları gibi URL nesnesine erişim sağlayacak URL ile açılmasına olanak sağlar. Standart sarma ftp veya http protokolü kullanılarak uzaktan dosya erişimi için sağlanan, zlib gibi bazı uzantıları ek korumalar kayıt olabilirsiniz.

Not: Bu ayar, güvenlik nedeniyle sadece php.ini dosyasından ayarlanabilir.

Ancak, sadece cron iş o sftp or rsync , doğrudan kullanan bir kabuk diyelim verebilir. PHP ile bunu yapmak zorunda değilsiniz.

I'm voting to move this to ServerFault to get better support for shell scripting.

Cevap hata mesajında, hakkı vardır:

Warning: fopen() [function.fopen]: URL file-access is disabled in the server configuration

URL sarma yoluyla dosya erişim sunucu yapılandırmasında devre dışı olduğu anlamına gelir.

, PHP yapılandırma kontrol özellikle allow_url_fopen. PHP belgelerine "Bu ayar güvenlik nedeniyle sadece php.ini dosyasından ayarlanabilir" diyor, yani orada kontrol edin.

Ayrıca bakınız fopen:. PHP dosya kayıtlı protokolü belirtir karar verdi ve bu protokol bir ağ URL olarak kayıtlı ise "PHP allow_url_fopen onu kapalı ise, PHP etkin olduğundan emin olmak için kontrol edecek Bir uyarı verir ve fopen çağrısı başarısız olur. " Bildiğim kadarıyla söyleyebilirim, orada tam olarak ne oluyor bu.

Eğer ya allow_url_fopen sağlayacak edemez, hala bazı seçenekleri vardır:

  • Doğrudan SFTP çağrı
  • sshfs ile bir pay montaj ve daha sonra normal bir klasör olarak kullanmak