From: Roland G. <rgi...@cp...> - 2007-03-19 15:36:31
|
hmm, first of all, why do you have to use sftp? how about using scp? :o) i wrote the example script below und tried it on cygwin, linux and aix. it works on both cygwin und aix, but has problems on linux, it doesn't capture the 'ls' output. so i guess there is something fishy with the pty on linux. the prompt correctly goes to Expects pty but the 'ls' output somehow manages to go directly to the terminal... :-( my $sftp = Expect->spawn("sftp $ARGV[0]"); my $sentLS; my $result; $sftp->expect(10, [ qr/sftp> \Z/ => sub { if ($sentLS) { $sftp->send("quit\r"); } else { $sftp->send("ls -1\r"); $sentLS = 1; } exp_continue; } ], [ qr/.+/ => sub { $result .= $sftp->match(); exp_continue; } ], [ timeout => sub { print "Timeout\n" } ], [ eof => sub { print "EOF\n" } ], ); $result =~ s{\r(?!\n)}{\n}g; $result =~ s{^}{>< }smg; print "$result\n"; On 3/13/07, Bryan Cox <co...@od...> wrote: > > > So, I've combed the archives and found similar problems, but no solution > (usually pty settings) that works for me. > > I can't install Net::SFTP, so I'm trying to implement an automated sftp via > Expect. > The example below uses a password login, but the problem is exactly the same > if I > use publickey authorization. > > > > # Spawn the sftp process > if ( not $expect->spawn( $_sftp_program, @cmd_parameters ) ) { > carp "ERROR: Unable to spawn $_sftp_program : $OS_ERROR\n"; > } > else { > $expect->restart_timeout_upon_receive(1); > > # Wait for prompt, send password if necessary > my @expect_result = $expect->expect( $_expect_timeout, > [ '-re', qr/password:/ => > sub { my $exp_self = shift; > print "\n\n-- sftp password prompt detected.\n" > if ( ( $self->verbose() > 1 ) > or $self->debug_ftp() ); > $exp_self->send( $self->password() . "\n" ); > print "-- sftp password sent\n\n" > if ( ( $self->verbose() > 1 ) > or $self->debug_ftp() ); > exp_continue() ; > } > ], > [ '-re', qr/$_sftp_prompt/ ], > # [ '-re', qr/(\n)|(\r)/ ] > ); > > The process spawns ok, and the password prompt is detected. The send() > works, and > the log shows that the password is accepted. After that, expect sees > nothing except a line return. > If I expect() on that (commented out above), I can then issue a send( "ls\n" > ). Again, expect() sees nothing, > but I can see the results and the prompt delivered to my terminal, usually > AFTER the timeout (depending on pty settings). > > In the log, the last line before timeout is generally around > > debug1: Authentication succeeded (password).^M > debug2: fd 4 setting O_NONBLOCK^M > debug3: fd 5 is O_NONBLOCK^M > debug2: fd 6 setting O_NONBLOCK^M > debug1: channel 0: new [client-session]^M > debug3: ssh_session2_open: channel_new: 0^M > debug2: channel 0: send open^M > debug1: Entering interactive session.^M > > On screen, I see > > -> -- sftp password sent > -> Continuing expect, restarting timeout... > -> spawn id(4): Does ` ' > -> match: > -> pattern #1: -re `(?-xism:password:)'? No. > -> pattern #2: -re `(?-xism:sftp>)'? No. > -> pattern #3: -re `(?-xism:(\n)|(\r))'? No. > -> Waiting for new data (10 seconds)... > -> spawn id(4): new data. > -> spawn id(4): read 2 byte(s). > -> spawn id(4): Does ` \r\n' > -> match: > -> pattern #1: -re `(?-xism:password:)'? No. > -> pattern #2: -re `(?-xism:sftp>)'? No. > -> pattern #3: -re `(?-xism:(\n)|(\r))'? YES!! > -> Before match string: ` ' > -> Match string: `\r' > -> After match string: `\n' > -> Matchlist: (`', `\r') > -> Returning from expect successfully. > -> spawn id(4): accumulator: `\n' > Retrieving a list of remote files .. > -> Sending 'ls\n' to spawn id(4) > -> at /home/coxb/lib/Expect.pm line 1277 > -> Expect::print('Expect=GLOB(0x30a2ca94)', 'ls\x{a}') > called at /home/coxb/lib/ODS/FtpSftp.pm line 396 > -> > ODS::FtpSftp::_list_files_sftp('ODS::FtpSftp=HASH(0x30a2b588)') > called at /home/coxb/lib/ODS/FtpSftp.pm line 96 > -> > ODS::FtpSftp::list_files('ODS::FtpSftp=HASH(0x30a2b588)') > called at /file_xfer line 253 > -> expect(Expect=GLOB(0x30a2ca94) 10 ARRAY(0x30a2f2ec)) called... > -> expect(): handling param 'ARRAY(0x30a2f2ec)'... > -> Starting EXPECT pattern matching... > -> at /home/coxb/lib/Expect.pm line 564 > -> Expect::expect('Expect=GLOB(0x30a2ca94)', 10, > 'ARRAY(0x30a2f2ec)') called at /home/coxb/lib/ODS/FtpSftp.pm line 397 > -> > ODS::FtpSftp::_list_files_sftp('ODS::FtpSftp=HASH(0x30a2b588)') > called at /home/coxb/lib/ODS/FtpSftp.pm line 96 > -> > ODS::FtpSftp::list_files('ODS::FtpSftp=HASH(0x30a2b588)') > called at /file_xfer line 253 > -> spawn id(4): beginning expect. > -> Timeout: 10 seconds. > -> Current time: Tue Mar 13 12:47:43 2007 > -> spawn id(4): list of patterns: > -> #1: -re `(?-xism:sftp>)' > -> spawn id(4): Does `\n' > -> match: > -> pattern #1: -re `(?-xism:sftp>)'? No. > -> Waiting for new data (10 seconds)... > -> spawn id(4): new data. > -> spawn id(4): read 4 byte(s). > -> ls > -> spawn id(4): Does `\nls\r\n' > -> match: > -> pattern #1: -re `(?-xism:sftp>)'? No. > -> Waiting for new data (10 seconds)... > -> sftp> THEFILEIMLOOKINGFOR.DAT > -> sftp> TIMEOUT > > I've tried every stty setting for both control and slave, including -file. > Nothing works. > > I'm connecting from AIX 5.3 back to myself, so the machine is known. > > I'd really appreciate some help on this. > > Thanks, > > -- Bryan > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share your > opinions on IT & business topics through brief surveys-and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > Expectperl-discuss mailing list > Exp...@li... > https://lists.sourceforge.net/lists/listinfo/expectperl-discuss > > |