Skip Menu |

This queue is for tickets about the Net-SFTP-Foreign CPAN distribution.

Report information
The Basics
Id: 75745
Status: rejected
Worked: 2 hours (120 min)
Priority: 0/
Queue: Net-SFTP-Foreign

People
Owner: Nobody in particular
Requestors: josemalonsom [...] yahoo.es
Cc:
AdminCc:

Bug Information
Severity: (no value)
Broken in: (no value)
Fixed in: (no value)



Subject: Net::SFTP:Foreign, setcwd() error
Date: Tue, 13 Mar 2012 20:03:03 +0100
To: bug-Net-SFTP-Foreign [...] rt.cpan.org
From: Jose María <josemalonsom [...] yahoo.es>
Hi, 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 /, and there is a directory named INPUT, when setcwd('INPUT') is executed the error is thrown. If instead the command setcwd('/INPUT') is executed no error is thrown. As i said the current directory is /, so that should not be necessary to give the absolute path, it works perfectly on other sftp servers. I have temporarily solved the problem with a small patch in my script concatenating the current path with the directory name. I think it's a server problem (the server belongs to a client and my only access is via sftp, is a J2SSH server), but perhaps there can be a solution from the module. Attached the following files: - script_error.pl: the script that thrown the error. - debug_with_error: the debug output of the error. - script_with_patch.pl: script with my patch. - debug_without_error: the debug output of the script with patch. The version of Net::SFTP::Foreign is 1.69. The version of perl is 5.8.8. And the uname -a output is: Linux myhostname 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux Thank you very much. (Sorry for my bad English).

Message body is not shown because sender requested not to inline it.

Message body is not shown because sender requested not to inline it.

Message body is not shown because sender requested not to inline it.

Message body is not shown because sender requested not to inline it.

Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Tue, 13 Mar 2012 15:20:28 -0700 (PDT)
To: "bug-Net-SFTP-Foreign [...] rt.cpan.org" <bug-Net-SFTP-Foreign [...] rt.cpan.org>
From: Salvador Fandino <sfandino [...] yahoo.com>
Show quoted text
----- 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'
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Thu, 15 Mar 2012 19:19:39 +0100
To: bug-Net-SFTP-Foreign [...] rt.cpan.org
From: Jose María <josemalonsom [...] yahoo.es>
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 text
sftp> 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 text
sftp>
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' >
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Fri, 16 Mar 2012 09:21:14 -0700 (PDT)
To: "bug-Net-SFTP-Foreign [...] rt.cpan.org" <bug-Net-SFTP-Foreign [...] rt.cpan.org>
From: Salvador Fandino <sfandino [...] yahoo.com>
Show quoted text
>________________________________ > From: Jose María via RT <bug-Net-SFTP-Foreign@rt.cpan.org> >To: >Sent: Thursday, March 15, 2012 7:19 PM >Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error > >       Queue: Net-SFTP-Foreign >Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=75745 > > > >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 . -> /
>sftp> cd INPUT
>debug3: Sent message fd 3 T:16 I:2 >debug3: SSH_FXP_REALPATH /INPUT -> /INPUT
Aqui tu cliente de SFTP no esta resolviendo "INPUT", sino "/INPUT" Si quieres que el modulo haga lo mismo, llama a $sftp->setcwd('/') primero.
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Sat, 17 Mar 2012 09:48:02 +0100
To: bug-Net-SFTP-Foreign [...] rt.cpan.org
From: Jose María <josemalonsom [...] yahoo.es>
El vie, 16-03-2012 a las 12:21 -0400, Salvador \"Fandiño\" via RT escribió: Show quoted text
> >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 . -> /
> >sftp> cd INPUT
> >debug3: Sent message fd 3 T:16 I:2 > >debug3: SSH_FXP_REALPATH /INPUT -> /INPUT
> > Aqui tu cliente de SFTP no esta resolviendo "INPUT", sino "/INPUT" > > > Si quieres que el modulo haga lo mismo, llama a $sftp->setcwd('/') > primero.
Quizá no me haya explicado bien: hacer $sftp->setcwd('/') no funciona de modo general, pongamos el siguiente ejemplo: ~$ sftp user1@myhost Connecting to myhost... Show quoted text
sftp> pwd
Remote working directory: /home/user1 Show quoted text
sftp> cd INPUT sftp> pwd
Remote working directory: /home/user1/INPUT Show quoted text
sftp>
en este caso si hiciera $sftp->setcwd('/') simplemente fallaría cuando después hiciera $sftp->setcwd('INPUT') porque '/INPUT' no existe, debería valer con únicamente hacer $sftp->setcwd('INPUT') desde el principio, que es como funciona en el resto de servidores. Si otros clientes de sftp resuelven bien el nombre del directorio, ¿por qué razón no lo hace el módulo?.
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Sat, 17 Mar 2012 04:49:04 -0700 (PDT)
To: "bug-Net-SFTP-Foreign [...] rt.cpan.org" <bug-Net-SFTP-Foreign [...] rt.cpan.org>
From: Salvador Fandino <sfandino [...] yahoo.com>
Show quoted text
----- Original Message -----
> From: Jose María via RT <bug-Net-SFTP-Foreign@rt.cpan.org> > To: > Cc: > Sent: Saturday, March 17, 2012 9:48 AM > Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error > >       Queue: Net-SFTP-Foreign > Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=75745 > > > El vie, 16-03-2012 a las 12:21 -0400, Salvador \"Fandiño\" via > RT > escribió:
>> >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 . -> /
>> >sftp> cd INPUT
>> >debug3: Sent message fd 3 T:16 I:2 >> >debug3: SSH_FXP_REALPATH /INPUT -> /INPUT
>> >> Aqui tu cliente de SFTP no esta resolviendo "INPUT", sino
> "/INPUT"
>> >> >> Si quieres que el modulo haga lo mismo, llama a
> $sftp->setcwd('/')
>> primero.
> > Quizá no me haya explicado bien: hacer $sftp->setcwd('/') no funciona > de > modo general, pongamos el siguiente ejemplo: > > ~$ sftp user1@myhost > Connecting to myhost...
> sftp> pwd
> Remote working directory: /home/user1
> sftp> cd INPUT > sftp> pwd
> Remote working directory: /home/user1/INPUT
> sftp>
> > en este caso si hiciera $sftp->setcwd('/') simplemente fallaría > cuando > después hiciera $sftp->setcwd('INPUT') porque '/INPUT' no > existe, > debería valer con únicamente hacer $sftp->setcwd('INPUT') desde el > principio, que es como funciona en el resto de servidores. > > Si otros clientes de sftp resuelven bien el nombre del directorio, ¿por > qué razón no lo hace el módulo?.
Pues no lo se. Puedes mostrarme la salida del programa sftp y del modulo, corriendo ambos en modo debug cuando accedes a uno de esos servidores en los que se comportan de manera distinta?
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Tue, 20 Mar 2012 19:11:13 +0100
To: bug-Net-SFTP-Foreign [...] rt.cpan.org
From: Jose María <josemalonsom [...] yahoo.es>
El sáb, 17-03-2012 a las 07:49 -0400, Salvador \"Fandiño\" via RT escribió: Show quoted text
Show quoted text
> > Si otros clientes de sftp resuelven bien el nombre del directorio, ¿por > > qué razón no lo hace el módulo?.
> > Pues no lo se. > > Puedes mostrarme la salida del programa sftp y del modulo, corriendo ambos en modo debug cuando accedes a uno de esos servidores en los que se comportan de manera distinta? >
Sí, sin problema, te adjunto dos archivos: - salida.net_sftp_foreign.debug: contiene la salida de Net::SFTP::Foreign con $Net::SFTP::Foreign::debug = -1 - salida.comando_sftp.vvv: contiene la salida del comando sftp con -vvv si necesitas alguna otra salida dímelo.

Message body is not shown because sender requested not to inline it.

Message body is not shown because sender requested not to inline it.

Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Tue, 20 Mar 2012 15:26:28 -0700 (PDT)
To: "bug-Net-SFTP-Foreign [...] rt.cpan.org" <bug-Net-SFTP-Foreign [...] rt.cpan.org>
From: Salvador Fandino <sfandino [...] yahoo.com>
Show quoted text
>________________________________ > From: Jose María via RT <bug-Net-SFTP-Foreign@rt.cpan.org> >To: >Sent: Tuesday, March 20, 2012 7:11 PM >Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error > >       Queue: Net-SFTP-Foreign >Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=75745 > > >El sáb, 17-03-2012 a las 07:49 -0400, Salvador \"Fandiño\" via RT >escribió: >
>> > Si otros clientes de sftp resuelven bien el nombre del directorio, ¿por >> > qué razón no lo hace el módulo?.
>> >> Pues no lo se. >> >> Puedes mostrarme la salida del programa sftp y del modulo, corriendo ambos en modo debug cuando accedes a uno de esos servidores en los que se comportan de manera distinta? >>
> >Sí, sin problema, te adjunto dos archivos: > >- salida.net_sftp_foreign.debug: contiene la salida de >Net::SFTP::Foreign con $Net::SFTP::Foreign::debug = -1 > >- salida.comando_sftp.vvv: contiene la salida del comando sftp con -vvv
Lo que muestran ambas salidas es que el servidor no resuelve los directorios de manera coherente. El cliente de sftp invoca el comando REALPATH pasandole '.' como argumento y de vuelta obtiene '/'. Luego abre '/INPUT', resultado de unir '/' e 'INPUT' y todo funciona correctamente. El modulo Net::SFTP::Foreign simplemente abre 'INPUT' lo cual debería de producir el mismo resultado, al resolverse en el servidor como '/INPUT', pero no es así. La forma más sencilla de solucionar esto es haciendo la siguiente llamada al principio de tu script:   $sftp->setcwd('.'); Eso hara que el modulo se comporte como el binario sftp.
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Wed, 21 Mar 2012 18:30:24 +0100
To: bug-Net-SFTP-Foreign [...] rt.cpan.org
From: Jose María <josemalonsom [...] yahoo.es>
El mar, 20-03-2012 a las 18:26 -0400, Salvador \"Fandiño\" via RT escribió: Show quoted text
Show quoted text
> Lo que muestran ambas salidas es que el servidor no resuelve los directorios de manera coherente. > > El cliente de sftp invoca el comando REALPATH pasandole '.' como argumento y de vuelta obtiene '/'. Luego abre '/INPUT', resultado de unir '/' e 'INPUT' y todo funciona correctamente. > > El modulo Net::SFTP::Foreign simplemente abre 'INPUT' lo cual debería de producir el mismo resultado, al resolverse en el servidor como '/INPUT', pero no es así. > > > La forma más sencilla de solucionar esto es haciendo la siguiente llamada al principio de tu script: > > $sftp->setcwd('.'); > > Eso hara que el modulo se comporte como el binario sftp. >
Sí, tienes razón, ejecutando $sftp->setcwd('.') al principio funciona en todos los casos. Entiendo entonces que al final es un problema del servidor y se puede dar esto por solucionado; no sé si en la lista de deseos se podría añadir que el módulo hiciera por defecto el setcwd('.') una vez abierta la conexión :). Otra cosa, creo que no merece la pena abrir otro bug por esto: con la versión 1.71 se produce un warning por una variable no inicializada al realizar una conexión utilizando password: Use of uninitialized value in length at /usr/lib/perl5/site_perl/5.8.8/Net/SFTP/Foreign/Backend/Unix.pm line 282. no te pongo código de ejemplo porque es muy fácil de reproducir, basta con realizar una conexión en la que la autenticación se realice por password. Un saludo y gracias; el módulo es muy útil.
Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error
Date: Wed, 21 Mar 2012 11:11:57 -0700 (PDT)
To: "bug-Net-SFTP-Foreign [...] rt.cpan.org" <bug-Net-SFTP-Foreign [...] rt.cpan.org>
From: Salvador Fandino <sfandino [...] yahoo.com>
Show quoted text
----- Original Message -----
> From: Jose María via RT <bug-Net-SFTP-Foreign@rt.cpan.org> > To: > Cc: > Sent: Wednesday, March 21, 2012 6:30 PM > Subject: Re: [rt.cpan.org #75745] Net::SFTP:Foreign, setcwd() error > >       Queue: Net-SFTP-Foreign > Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=75745 > > > El mar, 20-03-2012 a las 18:26 -0400, Salvador \"Fandiño\" via > RT > escribió: >
>> Lo que muestran ambas salidas es que el servidor no resuelve los
> directorios de manera coherente.
>> >> El cliente de sftp invoca el comando REALPATH pasandole '.' como
> argumento y de vuelta obtiene '/'. Luego abre '/INPUT', > resultado de unir '/' e 'INPUT' y todo funciona correctamente.
>> >> El modulo Net::SFTP::Foreign simplemente abre 'INPUT' lo cual
> debería de producir el mismo resultado, al resolverse en el servidor como > '/INPUT', pero no es así.
>> >> >> La forma más sencilla de solucionar esto es haciendo  la siguiente llamada
> al principio de tu script:
>> >>   $sftp->setcwd('.'); >> >> Eso hara que el modulo se comporte como el binario sftp. >>
> > Sí, tienes razón, ejecutando $sftp->setcwd('.') al principio funciona > en > todos los casos. Entiendo entonces que al final es un problema del > servidor y se puede dar esto por solucionado; no sé si en la lista de > deseos se podría añadir que el módulo hiciera por defecto el setcwd('.') > una vez abierta la conexión :).
No puede ser, porque alguien podría querer el comportamiento de ahora. El modulo tiene ya muchos años y esta es la primera vez que alguien reporta un bug como ese.
> Otra cosa, creo que no merece la pena abrir otro bug por esto: con la > versión 1.71 se produce un warning por una variable no inicializada al > realizar una conexión utilizando password: > > Use of uninitialized value in length at > /usr/lib/perl5/site_perl/5.8.8/Net/SFTP/Foreign/Backend/Unix.pm line > 282.
si, ese problema ya esta solucionado en la version 1.72_01