📄 ftp.pl
字号:
close( FH ); # shut down our end of the socket &ftp'close_data_socket; if( $len < 0 ){ print STDERR "\ntimed out reading data!\n"; return 0; } if( $ftp_show ){ if( $hashes && ($hashes % $ftp'hashnl) != 0 ){ print STDERR "\n"; } local( $secs ) = (time - $start_time); if( $secs <= 0 ){ $secs = 1; # To avoid a divide by zero; } local( $rate ) = int( $bytes / $secs ); print STDERR "Got $bytes bytes ($rate bytes/sec)\n"; } # # read the close # $ret = &ftp'expect($timeout, 226, "Got file", 1, # transfer complete, closing connection 250, "Got file", 1, # action completed 110, "restart not supported", 0, 425, "can't open data connection", 0, 426, "connection closed, transfer aborted", 0, 451, "action aborted, local error", 0, 421, "service unavailable, closing connection", 0); return $ret;}sub ftp'delete{ local( $rem_fname, $val ) = @_; &ftp'send("DELE $rem_fname" ); $val = &ftp'expect( $timeout, 250,"Deleted $rem_fname", 1, 550,"Permission denied",0 ); return $val == 1;}sub ftp'deldir{ local( $fname ) = @_; # not yet implemented # RMD}# UPDATE ME!!!!!!# Add in the hash printing and newline conversionsub ftp'put{ local( $loc_fname, $rem_fname ) = @_; local( $strip_cr ); if ($loc_fname eq "") { $loc_fname = $rem_fname; } if( ! &ftp'open_data_socket() ){ return 0; } &ftp'send("STOR $rem_fname"); # # the data should be coming at us now # local( $ret ) = &ftp'expect($timeout, 150, "sending $loc_fname", 1, 125, "data connection already open?", 0, 450, "file unavailable", 0, 532, "need account for storing files", 0, 452, "insufficient storage on system", 0, 553, "file name not allowed", 0, 500, "syntax error", 0, 501, "syntax error", 0, 530, "not logged in", 0, 421, "service unavailable, closing connection", 0); if( $ret != 1 ){ # shut down our end of the socket &ftp'close_data_socket; return 0; } # # the data should be coming at us now # # now accept accept(NS,S) || die "accept failed: $!"; # # open the local fname # if( !open(FH, "<$loc_fname") ){ print STDERR "Cannot open local file $loc_fname\n"; # shut down our end of the socket &ftp'close_data_socket; return 0; } while (<FH>) { print NS ; } close(FH); # shut down our end of the socket to signal EOF &ftp'close_data_socket; # # read the close # $ret = &ftp'expect($timeout, 226, "file put", 1, # transfer complete, closing connection 250, "file put", 1, # action completed 110, "restart not supported", 0, 425, "can't open data connection", 0, 426, "connection closed, transfer aborted", 0, 451, "action aborted, local error", 0, 551, "page type unknown", 0, 552, "storage allocation exceeded", 0, 421, "service unavailable, closing connection", 0); if( ! $ret ){ print STDERR "error putting $loc_fname\n"; } return $ret;}sub ftp'restart{ local( $restart_point, $ret ) = @_; &ftp'send("REST $restart_point"); # # see what they say $ret = &ftp'expect($timeout, 350, "restarting at $restart_point", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "REST not implemented", 2, 530, "not logged in", 0, 554, "REST not implemented", 2, 421, "service unavailable, closing connection", 0); return $ret;}# Set the file transfer typesub ftp'type{ local( $type ) = @_; &ftp'send("TYPE $type"); # # see what they say $ret = &ftp'expect($timeout, 200, "file type set to $type", 1, 500, "syntax error", 0, 501, "syntax error", 0, 504, "Invalid form or byte size for type $type", 0, 421, "service unavailable, closing connection", 0); return $ret;}$site_command_check = 0;@site_command_list = ();# routine to query the remote server for 'SITE' commands supportedsub ftp'site_commands{ local( $ret ); # if we havent sent a 'HELP SITE', send it now if( !$site_command_check ){ $site_command_check = 1; &ftp'send( "HELP SITE" ); # assume the line in the HELP SITE response with the 'HELP' # command is the one for us $ret = &ftp'expect( $timeout, ".*HELP.*", "", "\$1", 214, "", "0", 202, "", "0" ); if( $ret eq "0" ){ print STDERR "No response from HELP SITE\n" if( $ftp_show ); } @site_command_list = split(/\s+/, $ret); } return @site_command_list;}# return the pwd, or null if we can't get the pwdsub ftp'pwd{ local( $ret, $cwd ); &ftp'send( "PWD" ); # # see what they say $ret = &ftp'expect( $timeout, 257, "working dir is", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "PWD not implemented", 0, 550, "file unavailable", 0, 421, "service unavailable, closing connection", 0 ); if( $ret ){ if( $ftp'response =~ /^257\s"(.*)"\s.*$/ ){ $cwd = $1; } } return $cwd;}# return 1 for success, 0 for failuresub ftp'mkdir{ local( $path ) = @_; local( $ret ); &ftp'send( "MKD $path" ); # # see what they say $ret = &ftp'expect( $timeout, 257, "made directory $path", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "MKD not implemented", 0, 530, "not logged in", 0, 550, "file unavailable", 0, 421, "service unavailable, closing connection", 0 ); return $ret;}# return 1 for success, 0 for failuresub ftp'chmod{ local( $path, $mode ) = @_; local( $ret ); &ftp'send( sprintf( "SITE CHMOD %o $path", $mode ) ); # # see what they say $ret = &ftp'expect( $timeout, 200, "chmod $mode $path succeeded", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "CHMOD not implemented", 0, 530, "not logged in", 0, 550, "file unavailable", 0, 421, "service unavailable, closing connection", 0 ); return $ret;}# rename a filesub ftp'rename{ local( $old_name, $new_name ) = @_; local( $ret ); &ftp'send( "RNFR $old_name" ); # # see what they say $ret = &ftp'expect( $timeout, 350, "", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "RNFR not implemented", 0, 530, "not logged in", 0, 550, "file unavailable", 0, 450, "file unavailable", 0, 421, "service unavailable, closing connection", 0); # check if the "rename from" occurred ok if( $ret ) { &ftp'send( "RNTO $new_name" ); # # see what they say $ret = &ftp'expect( $timeout, 250, "rename $old_name to $new_name", 1, 500, "syntax error", 0, 501, "syntax error", 0, 502, "RNTO not implemented", 0, 503, "bad sequence of commands", 0, 530, "not logged in", 0, 532, "need account for storing files", 0, 553, "file name not allowed", 0, 421, "service unavailable, closing connection", 0); } return $ret;}sub ftp'quote{ local( $cmd ) = @_; &ftp'send( $cmd ); return &ftp'expect( $timeout, 200, "Remote '$cmd' OK", 1, 500, "error in remote '$cmd'", 0 );}# ------------------------------------------------------------------------------# These are the lower level support routinessub ftp'expectgot{ ($ftp'response, $ftp'fatalerror) = @_; if( $ftp_show ){ print STDERR "$ftp'response\n"; }}## create the list of parameters for chat'expect## ftp'expect(time_out, {value, string_to_print, return value});# if the string_to_print is "" then nothing is printed# the last response is stored in $ftp'response## NOTE: lmjm has changed this code such that the string_to_print is# ignored and the string sent back from the remote system is printed# instead.#sub ftp'expect { local( $ret ); local( $time_out ); local( $expect_args ); $ftp'response = ''; $ftp'fatalerror = 0; @expect_args = (); $time_out = shift(@_); while( @_ ){ local( $code ) = shift( @_ ); local( $pre ) = '^'; if( $code =~ /^\d/ ){ $pre =~ "[.|\n]*^"; } push( @expect_args, "$pre(" . $code . " .*)\\015\\n" ); shift( @_ ); push( @expect_args, "&ftp'expectgot( \$1, 0 ); " . shift( @_ ) ); } # Treat all unrecognised lines as continuations push( @expect_args, "^(.*)\\015\\n" ); push( @expect_args, "&ftp'expectgot( \$1, 0 ); 100" ); # add patterns TIMEOUT and EOF push( @expect_args, 'TIMEOUT' ); push( @expect_args, "&ftp'expectgot( \"timed out\", 1 ); 0" ); push( @expect_args, 'EOF' ); push( @expect_args, "&ftp'expectgot( \"remote server gone away\", 1 ); 0" ); if( $ftp_show > 9 ){ &printargs( $time_out, @expect_args ); } $ret = &chat'expect( $time_out, @expect_args ); if( $ret == 100 ){ # we saw a continuation line, wait for the end push( @expect_args, "^.*\n" ); push( @expect_args, "100" ); while( $ret == 100 ){ $ret = &chat'expect( $time_out, @expect_args ); } } return $ret;}## opens NS for io#sub ftp'open_data_socket{ local( $ret ); local( $hostname ); local( $sockaddr, $name, $aliases, $proto, $port ); local( $type, $len, $thisaddr, $myaddr, $a, $b, $c, $d ); local( $mysockaddr, $family, $hi, $lo ); $sockaddr = 'S n a4 x8'; chop( $hostname = `hostname` ); $port = "ftp"; ($name, $aliases, $proto) = getprotobyname( 'tcp' ); ($name, $aliases, $port) = getservbyname( $port, 'tcp' ); # ($name, $aliases, $type, $len, $thisaddr) =# gethostbyname( $hostname ); ($a,$b,$c,$d) = unpack( 'C4', $chat'thisaddr ); # $this = pack( $sockaddr, &main'AF_INET, 0, $thisaddr ); $this = $chat'thisproc; socket(S, $pf_inet, $sock_stream, $proto ) || die "socket: $!"; bind(S, $this) || die "bind: $!"; # get the port number $mysockaddr = getsockname(S); ($family, $port, $myaddr) = unpack( $sockaddr, $mysockaddr ); $hi = ($port >> 8) & 0x00ff; $lo = $port & 0x00ff; # # we MUST do a listen before sending the port otherwise # the PORT may fail # listen( S, 5 ) || die "listen"; &ftp'send( "PORT $a,$b,$c,$d,$hi,$lo" ); return &ftp'expect($timeout, 200, "PORT command successful", 1, 250, "PORT command successful", 1 , 500, "syntax error", 0, 501, "syntax error", 0, 530, "not logged in", 0, 421, "service unavailable, closing connection", 0);} sub ftp'close_data_socket{ close(NS);}sub ftp'send{ local($send_cmd) = @_; if( $send_cmd =~ /\n/ ){ print STDERR "ERROR, \\n in send string for $send_cmd\n"; } if( $ftp_show ){ local( $sc ) = $send_cmd; if( $send_cmd =~ /^PASS/){ $sc = "PASS <somestring>"; } print STDERR "---> $sc\n"; } &chat'print( "$send_cmd\r\n" );}sub ftp'printargs{ while( @_ ){ print STDERR shift( @_ ) . "\n"; }}sub ftp'filesize{ local( $fname ) = @_; if( ! -f $fname ){ return -1; } return (stat( _ ))[ 7 ]; }# make this package return true1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -