Hola,
muchas gracias por la pronta respuesta :).
El problema es que Net::SFTP::Foreign::realpath('INPUT') retorna INPUT,
pero este directorio se encuentra en la raíz (me refiero a lo que esté
configurado como raíz en el servidor sftp para el usuario de conexión,
no a la del sistema operativo) por lo que entiendo que debería
retornar /INPUT, de hecho en otros servidores es lo que hace. Cuando se
ejecuta el setcwd('INPUT') dentro del módulo hace un
$sftp->realpath($cwd), el cual retorna INPUT y falla el stat()
posterior, lo curioso es que Net::SFTP::Foreign::cwd() retorna '/', o
sea, que sí que existe información como para obtener el path absoluto.
No sé si el problema es realmente del módulo, cuando al servidor se le
pide que realice el SSH_FXP_REALPATH éste debería retornar el path
absoluto correctamente, cosa que parece que no hace en este caso. Sin
embargo utilizando directamente el comando sftp desde la shell funciona
sin problema, te pego un debug del cambio de directorio:
debug1: Sending subsystem: sftp
debug2: channel 0: request subsystem confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 1024000 rmax 65535
debug2: Remote version: 3
debug3: Sent message fd 3 T:16 I:1
debug3: SSH_FXP_REALPATH . -> /
Show quoted textsftp> cd INPUT
debug3: Sent message fd 3 T:16 I:2
debug3: SSH_FXP_REALPATH /INPUT -> /INPUT
debug3: Sent message fd 3 T:17 I:3
debug3: Received stat reply T:105 I:3
Show quoted textsftp>
como se puede ver en este caso sí que retorna correctamente el nombre
absoluto del directorio.
Hablo un poco desde la ignorancia, pero si con el comando sftp
SSH_FXP_REALPATH está retornando el nombre absoluto correctamente, ¿no
debería hacerlo también para el módulo?
El utilizar directamente $sftp->setcwd('/') en mi caso no es una opción,
el script realiza envíos a una larga lista de diferentes servidores ftp
utilizando un archivo de configuración, en el que el directorio destino
puede estar expresado como path relativo o absoluto y en el que el
directorio de trabajo actual una vez abierta la conexión no se conoce de
antemano.
Yo he solucionado el problema añadiendo el siguiente parche antes de
realizar cualquier setcwd() (suponiendo que $dir tenga el directorio
destino):
if ($dir !~ /^\//) {
$dir = File::Spec->canonpath($sftp->cwd() . '/' . $dir);
}
y con eso, por lo menos para todos los servidores a los que envío,
funciona en todos los casos, independientemente del directorio de
trabajo actual en el que se quede la sesión una vez abierta y de si el
directorio destino tiene configurado el nombre como absoluto o relativo.
El mar, 13-03-2012 a las 18:20 -0400, Salvador \"Fandiño\" via RT
escribió:
Show quoted text> <URL:
https://rt.cpan.org/Ticket/Display.html?id=75745 >
>
>
>
>
>
> ----- Original Message -----
> > From: Jose María via RT <bug-Net-SFTP-Foreign@rt.cpan.org>
> > To:
> > Cc:
> > Sent: Tuesday, March 13, 2012 8:03 PM
> > Subject: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
> >
> >T ue Mar 13 15:03:20 2012: Request 75745 was acted upon.
> > Transaction: Ticket created by josemalonsom@yahoo.es
> > Queue: Net-SFTP-Foreign
> > Subject: Net::SFTP:Foreign, setcwd() error
> > Broken in: (no value)
> > Severity: (no value)
> > Owner: Nobody
> > Requestors: josemalonsom@yahoo.es
> > Status: new
> > Ticket <URL:
https://rt.cpan.org/Ticket/Display.html?id=75745 >
> >
> >
> > Hi,
>
> Hola,
>
> > i want to report a problem with Net::SFTP:Foreign that causes an error
> > "Couldn't stat remote file (stat): File not found!" when a
> > setcwd()
> > command is executed.
> >
> > The problem has appeared in a single server. Once the connection has
> > opened the working directory is /,
>
> Normalmente esto no es así. Cuando se inicia una nueva sesión de SFTP, el cwd es '.', un path relativo que el servidor convierte en absoluto de una manera no especificada. Por ejemplo, con OpenSSH, '.' se convierte en '~/' (el home del usuario) y otros servidores pueden hacer cosas distintas.
>
> La forma más fácil que se me ocurre de solucionar tu problema es hacer una llamada a $sftp->setcwd('/') nada más crear el objeto $sftp. Así, cuando despues llames a $sftp->setcwd('INPUT') el modulo ya se encargara de resolver 'INPUT' como '/INPUT'
>