Question

Je suis en train d'écrire un simple client SFTP en PHP parce que nous avons besoin de récupérer des fichiers via n programatically des serveurs distants. J'utilise l'extension PECL SSH2.

J'ai couru contre un barrage routier, cependant. La documentation sur php.net suggère que vous pouvez faire ceci:

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

Cependant, j'ai une méthode ls qui tente quelque chose de similaire à

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

Je reçois l'erreur suivante:

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

est parfaitement logique parce que ce qui arrive quand vous lancez une ressource à chaîne. La documentation est mauvaise? J'ai essayé de remplacer la ressource avec l'hôte, le nom d'utilisateur et hôte et cela ne fonctionne pas non plus. Je sais que le chemin est correct parce que je peux courir SFTP à partir de la ligne de commande et il fonctionne très bien.

Quelqu'un at-il essayé d'utiliser lextension SSH2 avec SFTP? Est-ce que je manque quelque chose évidente ici?

Mise à jour:

Je sftp d'installation sur une autre machine en interne et il fonctionne très bien. Donc, il doit y avoir quelque chose sur le serveur que je suis en train de se connecter à ce qui ne fonctionne pas.

Était-ce utile?

La solution

Lors de la connexion à un serveur SFTP et vous avez besoin de se connecter au dossier racine (par exemple pour la lecture du contenu du dossier), vous obtenez toujours l'erreur lors de l'utilisation juste « / » comme le chemin.

La solution que j'ai trouvé était d'utiliser le chemin « /./ », qui est un chemin valide que les références dans le dossier racine. Ceci est utile lorsque l'utilisateur que vous ouvrez une session avec un accès uniquement à son propre dossier racine et aucun chemin d'accès complet est disponible.

Ainsi, la requête au serveur lorsque vous essayez de lire le contenu du dossier racine doit être quelque chose comme ceci:

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

Autres conseils

Pour les versions php> 5.6.27 utilisation intval ()

$sftpConnection = ssh2_connect($host);
$sftp = ssh2_sftp($sftpConnection);
$fp = fopen("ssh2.sftp://" . intval($sftp) . $remoteFile, "r");

https://bugs.php.net/bug.php?id=73597

Je vais avoir un problème similaire. Je suppose que vous faites quelque chose de similaire à ceci:

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

Quand $remote_dir est le chemin complet de la racine open_dir puis œuvres. Si $remote_dir est juste « / » ou « », je reçois la « erreur ne peut pas ouvrir » comme vous l'avez fait.

Dans mon cas, il semble ssh se connecte au dossier racine au lieu du répertoire « home » comme ftp fait. Vous avez dit qu'il a travaillé sur un autre serveur, donc je me demande si elle est juste un problème de configuration.

la façon la plus facile d'obtenir SFTP travailler dans PHP (même sur les fenêtres) sans installer etc extension est PHPSECLIB: http: //phpseclib.sourceforge.net/ . Le truc SSH est complètement mis en œuvre dans une classe PHP.

Vous utilisez est comme ceci:

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

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

echo $sftp->pwd();
?>

La documentation sur cette page contient une erreur. Jetez un oeil à l'exemple ici au lieu: http://php.net/ssh2_sftp - ce que vous avez réellement besoin de faire est d'ouvrir une ressource spéciale SFTP en utilisant ssh2_sftp () avant de l'utiliser avec fopen (). Et oui, il semble que tout comme, par exemple « Ressource # 24 » lorsqu'il est converti en chaîne ... un peu bizarre, mais apparemment cela fonctionne.

Une autre mise en garde est que SFTP démarre dans le répertoire racine plutôt que le répertoire personnel de l'utilisateur distant, de sorte que votre chemin d'accès distant dans l'URI doit toujours être absolue.

Je viens d'avoir le même problème, mais je ne pouvais comprendre le problème.

Sur mon cas, lors de la connexion au serveur, j'allais à la racine du compte, et en raison de serveur configs je ne pouvais pas y écrire.

Je suis connecté au compte à l'aide d'un fireftp, et je pouvais voir où la racine du compte était ... c'était la racine du serveur.

Je devais inclure tout le chemin jusqu'à ce que le dossier où je suis autorisé à écrire, et je pouvais résoudre le problème.

Alors, mon conseil est d'obtenir le chemin à l'aide d'une interface graphique (je l'ai utilisé fireftp), et ajouter tout le chemin à votre code.


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

Espérons que cela vous aidera et d'autres personnes avec le même problème!

Vive!

J'ai récemment essayé d'obtenir SFTP sur PHP travail et a constaté que phpseclib était beaucoup plus facile à utiliser:

http://phpseclib.sourceforge.net/

Si vous avez le luxe de ne pas être sur un hôte partagé et peut installer ce extensions que vous voulez peut-être l'extension PECL serait mieux, mais pas nous sommes tous tellement chanceux. De plus, l'API de phpseclib ressemble un peu plus intuitif, étant OOP et tout.

Ma question était, que je RACCODER URL de chaîne fonction et revenir avec des ressources à l'intérieur. Unfortunatelly ressource est créée que dans le contexte de la fonction et garbage collector est déconnectait ressource sur la fin de la fonction. Solution:. Retour ressource en référence et unset manuellement dans le contexte plus complexe

résolu mon problème en permettant le support SFTP sur le serveur (Powershell)

Ceci est un bogue dans le package SSH2 que j'ai trouvé il y a quelques années et a affiché un patch pour php.net. Il résout ce problème, mais nécessite une reconstruction du paquet SSH2 pecl. Vous pouvez en lire plus ici: https://bugs.php.net/bug.php? id = 69981 . J'ai inclus un patch là pour le fichier ssh2_fopen_wrappers.c dans le package pour résoudre le problème. Voici un commentaire que j'inclus:

Voici une ligne de code ssh2_fopen_wrappers.c qui provoque ce bug: (commentaire inclus)

/*
       Find resource->path in the path string, then copy the entire string from the original path.
       This includes ?query#fragment in the path string
*/
    resource->path = estrdup(strstr(path, resource->path));

Cette ligne de code - et donc ce bug - a été présenté comme un correctif pour le bogue # 59794. Cette ligne de code tente d'obtenir une chaîne contenant la partie, la requête et fragment de la variable de chemin. Considérez cette valeur pour la variable de chemin:

ssh2.sftp://Resource id #5/topdir?a=something#heading1

chemin Resource-> est "/ topdir", le résultat est que "/ topdir? A = quelque chose # heading1" est attribué, à Resource-> chemin comme le commentaire dit.

Considérons maintenant le cas lorsque le chemin en ressources> est « / ». Après la ligne de code est exécuté, le chemin en ressources> devient "// Resource id # 5 / topdir # heading1". Ceci est clairement pas ce que vous voulez. Voici une ligne de code qui fait:

 resource->path = estrdup( strstr( strstr( path, "//" ) + 2, "/" ) );

Vous devrez peut-être appliquer le correctif pour le bogue # 73597 qui supprime « Resource id # » de la chaîne de chemin avant d'appeler php_url_parse ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top