SFTP PHP çalışmak için alınamıyor

6 Cevap php

Biz programlama n uzak sunucular üzerinden dosya almak için ihtiyaç var çünkü ben PHP basit bir SFTP istemcisi yazıyorum. Ben PECL SSH2 uzantısını kullanıyorum.

Ama, bir yol blok karşı çalıştırmak. Php.net üzerindeki belgeler bunu düşündürmektedir:

$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');

Ancak, benzer bir şey için çalışır bir ls yöntemi var

public function ls($dir)
{
    $rd = "ssh2.sftp://{$this->sftp}/$dir";
    $handle = opendir($rd);
    if (!is_resource($handle)) {
        throw new SFTPException("Could not open directory.");
    }

    while (false !== ($file = readdir($handle))) {
        if (substr($file, 0, 1) != '.'){
            print $file . "\n";
        }
    }
    closedir($handle);
}

Ben şu hatayı alıyorum:

PHP Warning:  opendir(): Unable to open ssh2.sftp://Resource id #5/outgoing on remote host

Size dizeye bir kaynak döküm ne olur, çünkü bu mükemmel mantıklı. Belgelerine yanlış mı? Ben ev sahibi, kullanıcı adı ve host ve bu da işe yaramadı ile kaynak değiştirmeyi denedim. Ben komut satırından SFTP'yi çalıştırabilirsiniz çünkü yolun doğru olduğunu biliyorum ve iyi çalışıyor.

Başkasının SFTP ile SSH2 extenstion kullanmaya çalışmıştır? Burada belirgin bir şey eksik?

UPDATE:

Gayet güzel çalışıyor in-house ve bir başka makineye ben kurulum sftp. Yani, ben çalışmadığını bağlanmaya çalışıyorum sunucuyla ilgili bir şey olmalı.

6 Cevap

Bu bir cevap ararken hala google ilk gösterir eski bir soru olsa da bu yüzden benim iki kuruş koymak gerekir ...

SFTP sunucusuna bağlanma ve sadece "/" yolu olarak kullanırken hala hatayı alacağı (klasörün içeriğini okumak için örneğin) kök klasöre bağlanmak için gerektiğinde.

Bulduğum çözüm "/. /", O kök klasöre başvuruları geçerli bir yol var yolu kullanmak oldu. Eğer ile oturum kullanıcı sadece kendi kök klasöründe ve hiçbir tam yolunu ulaşıma açtı yararlıdır kullanılabilir.

Yani kök klasörün içeriğini okumaya çalışıyorum sunucuya istek böyle bir şey olmalı:

$rd = "ssh2.sftp://{$this->sftp}/./";

Birisi bu faydali bulur umuyoruz

Ben benzer bir sorunu yaşıyorum. Ben buna benzer bir şey yaptığını varsayalım:

    $dir = "ssh2.sftp://{$sftp}{$remote_dir}"; 
    $handle = opendir($dir);

$remote_dir kökünden tam yoludur o zaman open_dir çalışır. $remote_dir sadece '/' veya'' ise, o zaman ben size yaptığı gibi hata 'açamıyor' olsun.

Benim durumumda, bu ssh ftp yaptığı gibi yerine 'ev' dizinin kök klasörde bağlanır gibi görünüyor. Sen farklı bir sunucu üzerinde çalıştı belirtti, bu yüzden sadece bir yapılandırma sorunu olup olmadığını merak ediyorum.

Bu sayfada belgelerine bir hata içeriyor. Yerine buraya örneğe bir göz atın: http://php.net/ssh2_sftp - ne aslında yapmanız gereken önce fopen () ile bunu kullanarak ssh2_sftp kullanarak özel bir SFTP kaynak () açmak. Ve evet, örneğin, sadece benziyor "Kaynak # 24" dizeye dönüştürülür zaman ... biraz garip ama görünüşe göre çalışır.

Başka bir uyarı SFTP yerine uzaktaki kullanıcının ev dizininde daha kök dizinde başlar, böylece URI uzaktan yolu her zaman mutlak bir olmalıdır olmasıdır.

Ben sadece aynı sorunu vardı, ama sorunu anlamaya olabilir.

Sunucuya bağlanırken benim durumumda, ben hesap köküne gidiyordu, ve bağlı sunucu yapılandırmaları için oraya yazmak mümkün değildi.

Ben bir FireFTP kullanarak hesabınıza bağlı olan ve hesap kökü sunucunun kök oldu ... nerede ben görebiliyordum.

Ben yazmak için izin klasöre kadar tüm yolu eklemek için vardı ve bu yüzden sorunu çözmek olabilir.

Yani, benim tavsiyem (ben fireftp kullandım) bir grafik arayüzü kullanarak yol almak, ve kod için bütün yolu eklemektir.


$pathFromAccountRootFolderToMyDestinationFolder = '/Account/Root/Folder/To/My/Folder';
$stream = fopen("ssh2.sftp://".$sftp."/".$pathFromAccountRootFolderToMyDestinationFolder."/myFile.ext", 'r');

Bu aynı konuda size ve diğer insanlara yardımcı olacağını umuyoruz!

Şerefe!

uzatma vb kurmadan (hatta windows) PHP içinde çalışan SFTP almak için en kolay yolu olduğunu PHPSECLIB: http://phpseclib.sourceforge.net/. SSH şeyler tamamen bir PHP sınıfı uygulanmaktadır.

Bu gibi kullanabilirsiniz:

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

echo $sftp->pwd();
?>

Geçenlerde PHP çalışmaya SFTP'yi almaya çalıştı ve phpseclib kullanımı çok daha kolay olduğunu öğrendim:

http://phpseclib.sourceforge.net/

Eğer paylaşılan bir bilgisayar üzerinde olmak ve belki PECL uzantısı daha iyi olurdu istersen uzantıları yükleyebilirsiniz değil lüks varsa ama hepimiz çok şanslıyız. Ayrıca, phpseclib API OOP ve tüm varlık, biraz daha sezgisel görünüyor.