in reply to SFTP hangs (winxp)

First off, I assume that you have tried connecting directly using sftp and verified that the remote server is properly configured to use it? I am especially concerned to see this line in your debug output:

denmark: Remote protocol version 1.99, ...

Assuming no problems there, it is helpful to look at the code (this is also helpful). The relevant chunk is:

buffer_put_char(&msg, SSH2_FXP_INIT); buffer_put_int(&msg, SSH2_FILEXFER_VERSION); send_msg(fd_out, &msg); buffer_clear(&msg); get_msg(fd_in, &msg); /* Expecting a VERSION reply */

Which indicates that it is hanging while waiting for a version response from the remote machine. Again, I have concerns that the remote machine may not be set up correctly. Do you have debugging info from the server? If you cannot touch it to debug, consider testing sftp connections to your local machine. If those work, you then really have to examine the remote server.


My parents just came back from a planet where the dominant life form had no
bilateral symmetry, and all I got was this stupid F-Shirt.

Replies are listed 'Best First'.
Re: Re: SFTP hangs (winxp)
by rkg (Hermit) on Nov 09, 2003 at 09:46 UTC
    Yes, I can use sftp (via putty's psftp ) and grab the files manually. I'm using a password, not running pageant.

    I am not sure how to see debug info from the server; as it is a shared box (I am a guest, I don't control it), I suspect I can't.

    I'd rather do this in perl; though if need be, I guess I can use putty batch scrips wrapped in backticks.

    Thanks idsfa for any ideas.........

      Ask the sysadmin of the remote machine if they would be willing to set up a second sshd on another port with logging cranked up so that you can test. It's worth a shot. Otherwise, you need to step through to find the part that is breaking your code.

      Begin at the beginning. First, confirm that you can get Net::SSH::Perl working:

      my $ssh = Net::SSH::Perl->new("host1", protocol=>2, debug=>1); $ssh->login("user1", "pass1"); ($out, $err, $exit) = $ssh->cmd("hostname"); print "Out: $out$/Err: $err$/Exit: $exit$/";

      If that doesn't return the hostname (modulo any syntax errors ... I didn't test the code), then there is something wrong with the server.

      From there, step through the Net::SFTP code until you find the bit that breaks it. (extract follows)

      sub do_init { my $sftp = shift; my $ssh = $sftp->{ssh}; $sftp->debug("Sending SSH2_FXP_INIT"); my $msg = $sftp->new_msg(SSH2_FXP_INIT); $msg->put_int32(SSH2_FILEXFER_VERSION); $sftp->send_msg($msg); $msg = $sftp->get_msg; my $type = $msg->get_int8; if ($type != SSH2_FXP_VERSION) { croak "Invalid packet back from SSH2_FXP_INIT (type $type)"; } my $version = $msg->get_int32; $sftp->debug("Remote version: $version"); ## XXX Check for extensions. } . . . sub send_msg { my $sftp = shift; my($buf) = @_; my $b = Net::SFTP::Buffer->new; $b->put_int32($buf->length); $b->append($buf->bytes); $sftp->{channel}->send_data($b->bytes); }

      Good luck bughunting ...


      My parents just came back from a planet where the dominant life form had no
      bilateral symmetry, and all I got was this stupid F-Shirt.
        Hi idsfa,

        Just getting around to trying your suggestion after a long delay. Thanks for the advice.

        After installing Net::SSH::W32Perl, I tried your test script. It logs in happily, then hangs at the "hostname" command, sort of like my original post. Any ideas, or do you think the problem is on the server side?

        rkg

        C:\perl\test_snippets>perl net-ssh.pl denmark: Reading configuration data /.ssh/config denmark: Reading configuration data /etc/ssh_config denmark: Connecting to XXXXXXXXXX, port 22. denmark: Socket created, turning on blocking... denmark: Remote protocol version 1.99, remote software version OpenSSH +_3.4p1 denmark: Net::SSH::Perl Version 1.23, protocol version 2.0. denmark: No compat match: OpenSSH_3.4p1. denmark: Connection established. denmark: Sent key-exchange init (KEXINIT), wait response. denmark: Algorithms, c->s: 3des-cbc hmac-sha1 none denmark: Algorithms, s->c: 3des-cbc hmac-sha1 none denmark: Entering Diffie-Hellman Group 1 key exchange. denmark: Sent DH public key, waiting for reply. denmark: Received host key, type 'ssh-dss'. denmark: Host XXXXXXX is known and matches the host key. denmark: Computing shared secret key. denmark: Verifying server signature. denmark: Waiting for NEWKEYS message. denmark: Enabling incoming encryption/MAC/compression. denmark: Send NEWKEYS, enable outgoing encryption/MAC/compression. denmark: Sending request for user-authentication service. denmark: Service accepted: ssh-userauth. denmark: Trying empty user-authentication request. denmark: Authentication methods that can continue: publickey,password, +keyboard-interactive. denmark: Next method to try is publickey. denmark: Next method to try is password. denmark: Trying password authentication. denmark: Login completed, opening dummy shell channel. denmark: channel 0: new [client-session] denmark: Requesting channel_open for channel 0. denmark: channel 0: open confirm rwindow 0 rmax 32768 denmark: Got channel open confirmation, requesting shell. denmark: Requesting service shell on channel 0. denmark: channel 1: new [client-session] denmark: Requesting channel_open for channel 1. denmark: Entering interactive session. denmark: Sending command: hostname denmark: Requesting service exec on channel 1. denmark: channel 1: open confirm rwindow 0 rmax 32768
        ...and it hangs here.

        Here's the code

        use Net::SSH::W32Perl; my $ssh = Net::SSH::W32Perl->new("XXXXXX", protocol=>2, debug=>1); $ssh->login("XXXXX", "XXXXXX"); ($out, $err, $exit) = $ssh->cmd("hostname"); print "Out: $out$/Err: $err$/Exit: $exit$/";