Pregunta

Estoy escribiendo un simple cliente SFTP en PHP porque tenemos la necesidad de recuperar mediante programación archivos a través de servidores remotos n. Estoy usando la extensión PECL SSH2.

Me he topado con un obstáculo en el camino, sin embargo. La documentación en php.net sugiere que usted puede hacer esto:

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

Sin embargo, tengo un método ls que intenta algo similar

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

Me sale el siguiente error:

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

Esto tiene mucho sentido, porque eso es lo que pasa cuando lanzas un recurso de cadena. Es incorrecta la documentación? He intentado reemplazar el recurso con el anfitrión, nombre de usuario, y el anfitrión y que tampoco funcionó. Sé que la ruta es correcta porque puedo correr SFTP desde la línea de comandos y funciona bien.

Tiene cualquier persona trató de usar que la extension SSH2 con SFTP? Me estoy perdiendo algo obvio aquí?

ACTUALIZACIÓN:

SFTP configuración en otra máquina en la casa y funciona muy bien. Por lo tanto, tiene que haber algo sobre el servidor que estoy intentando conectar con que no está trabajando.

¿Fue útil?

Solución

Cuando se conecta a un servidor SFTP y que necesita para conectarse a la carpeta raíz (por ejemplo, para leer el contenido de la carpeta) a pesar de ello obtener el error cuando se utiliza sólo "/" como el camino.

La solución que encontré fue utilizar el camino "/./", que es una ruta válida que las referencias a la carpeta raíz. Esto es útil cuando el usuario está iniciando sesión con sólo tiene acceso a su propia carpeta raíz y la ruta completa está disponible.

Así que la solicitud al servidor al intentar leer el contenido de la carpeta raíz debe ser algo como esto:

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

Otros consejos

En versiones de PHP> 06/05/27 uso 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

Estoy teniendo un problema similar. Asumo que está haciendo algo similar a esto:

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

Cuando $remote_dir es la ruta completa desde la raíz a continuación open_dir obras. Si $remote_dir es sólo '/' o '', entonces consigo el 'no se puede abrir' error como lo hizo.

En mi caso, parece ssh se conecta a la carpeta raíz en lugar del directorio 'casa' como ftp hace. Usted ha mencionado que funcionaba en un servidor diferente, por lo que se pregunta si es sólo un problema de configuración.

la forma más sencilla de obtener SFTP trabajar dentro de PHP (incluso en las ventanas) sin instalar ningún etc extensión es PHPSECLIB: http: //phpseclib.sourceforge.net/ . El material SSH está completamente implementado en una clase PHP.

que se utiliza es la siguiente:

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

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

echo $sftp->pwd();
?>

La documentación de esa página contiene un error. Echar un vistazo a este ejemplo en su lugar: http://php.net/ssh2_sftp - lo que realmente necesita hacer es abrir un recurso mediante ssh2_sftp SFTP especial () antes de usarlo con fopen (). Y sí, se parece a que, por ejemplo, "Recurso # 24" cuando se convierte a cadena ... un poco raro pero aparentemente funciona.

Otra advertencia es que SFTP comienza en el directorio raíz en lugar del directorio principal del usuario remoto, por lo que su ruta remota en el URI debe ser siempre un absoluto.

Sólo tenía el mismo problema, pero pude averiguar el problema.

En mi caso, cuando se conecta al servidor, que iba a la raíz de la cuenta, y debido a configuraciones de servidor que no era capaz de escribir allí.

He conectado a la cuenta utilizando un fireFTP, y así pude ver dónde estaba la raíz de la cuenta ... era la raíz del servidor.

he tenido que incluir todo el camino hasta la carpeta en la que se me permite escribir, y por lo que podría resolver el problema.

Por lo tanto, mi consejo es para obtener la ruta utilizando una interfaz gráfica (He utilizado fireFTP), y añadir todo el camino a su código.


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

Espero que esto ayudará a que usted y otras personas con el mismo problema!

Saludos!

Recientemente he intentado conseguir SFTP en PHP de trabajo y se encontró que phpseclib era mucho más fácil de usar:

http://phpseclib.sourceforge.net/

Si usted tiene el lujo de no estar en un servidor compartido y puede instalar cualquier extensión que desea tal que la extensión PECL sería mejor, pero no todos son tan afortunados. Además, la API de phpseclib se ve un poco más intuitivo, siendo programación orientada a objetos y todo.

Mi problema era que yo estaba conectando en la función y regresar URL cadena con recursos dentro. Desafortunadamente recurso es que crea en el contexto función y recolector de basura se está desconectando de recursos en función final. Solución:. Recurso de regreso por referencia y desarmar manualmente en su contexto más complejo

resolvió mi problema habilitando soporte SFTP en el servidor (PowerShell)

Se trata de un error en el paquete ssh2 que encontré hace años y publicado un parche para php.net. Se corrige este problema, sino que requiere una reconstrucción del paquete pecl ssh2. Puede leer más aquí: https://bugs.php.net/bug.php? id = 69981 . He incluido un parche que hay en el fichero de ssh2_fopen_wrappers.c en el paquete para solucionar el problema. Aquí está un comentario Incluí:

Esta es una línea de código de ssh2_fopen_wrappers.c que causa este error: (comentario incluido)

/*
       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));

Esta línea de código - y por lo tanto este error - se introdujo como una solución para el bug # 59794. Esa línea de código está tratando de obtener una cadena que contiene la pieza, la consulta y el fragmento de la variable de ruta. Considere este valor para la variable de ruta:

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

Cuando en recursos> camino es "/ topdir", el resultado es que "/ topdir? A = algo # encabezado1" se asigna a en recursos> camino al igual que el comentario dice.

Ahora consideremos el caso cuando en recursos> camino es "/". Después de ejecutar la línea de código, en recursos> camino se vuelve "// Resource id # 5 / topdir # encabezado1". Esto claramente no es lo que quiere. Aquí está una línea de código que hace:

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

También puede ser necesario aplicar el parche para el bug # 73597 que elimina "Resource id #" de la cadena de ruta antes de llamar php_url_parse ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top