curl-users
attempted scp responds with Info: Channel failed to close: -34
Date: Fri, 25 Apr 2014 17:10:31 -0400 (EDT)
Not too sure why I am getting this message.
Info: Channel failed to close: -34
Trying to test an scp upload of a test file.
curl version :
node002$ curl --version
curl 7.34.0 (sparc-sun-solaris2.10) libcurl/7.34.0 OpenSSL/1.0.1g
zlib/1.2.7 libidn/1.26 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps
pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
I see this :
== Info: Hostname was NOT found in DNS cache
== Info: Trying xxx.xxx.xxx.xxx...
== Info: Adding handle: conn: 0x100157250
== Info: Adding handle: send: 0
== Info: Adding handle: recv: 0
== Info: Curl_addHandleToPipeline: length: 1
== Info: - Conn 0 (0x100157250) send_pipe: 1, recv_pipe: 0
== Info: Connected to sometest.server.com (xxx.xxx.xxx.xxx) port 22 (#0)
== Info: SSH MD5 fingerprint: feedbeef389d2586badcaffe1b8bc9b8
== Info: SSH authentication methods available:
gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive
== Info: Using ssh public key file
/export/home/debug/pgm/curl/scp_test_001/.ssh/test_rsa.id.pub
== Info: Using ssh private key file
/export/home/debug/pgm/curl/scp_test_001/.ssh/test_rsa.id
== Info: Initialized SSH public key authentication
== Info: Authentication complete
== Info: SSH CONNECT phase done
== Info: Channel failed to close: -34
== Info: Connection #0 to host sometest.server.com left intact
0.000 bytes/sec for 1.473 secs
res = 0 (write_error = 0)
Data length received : 0 bytes
Sure enough at the other end on the remote server I see :
# ls -l drop_things_here/
total 0
-rw-r--r-- 1 debug staff 0 Apr 25 20:02 foo.dat
A zero byte file. Not too useful.
The essential bits of code that did this was :
FILE *inputdat;
FILE *logfile;
struct stat datfid;
int dat_stat, j, k;
double accum, total_time, speed_upload;
char* dat_buffer;
char* ssh_pub_key_file =
"/export/home/debug/pgm/curl/scp_test_001/.ssh/test_rsa.id.pub";
char* ssh_priv_key_file =
"/export/home/debug/pgm/curl/scp_test_001/.ssh/test_rsa.id";
char* ssh_pass = "some_passphrase_string";
struct dataflags config;
config.trace_ascii = 1;
dat_stat = stat ( DATFILENAME, &datfid );
if ( dat_stat != 0 ) {
perror ( "INPUT Error: " );
exit ( EXIT_FAILURE );
}
fprintf ( stderr, "input dat file size = %i bytes\n",
( int ) datfid.st_size );
dat_buffer = calloc( (size_t) ( ( int ) datfid.st_size + 1 ),
(size_t) sizeof( unsigned char
) );
fprintf ( stderr, "dat_buffer addr = %p\n", dat_buffer );
fprintf ( stderr, "dat_buffer size = %0xh bytes\n",
( int ) datfid.st_size +
1 );
inputdat = fopen( DATFILENAME, "r" );
fread ( dat_buffer, datfid.st_size, 1, inputdat );
logfile = fopen( "/dev/null", "w" );
/* the above is a bit of a waste given that the CURLOPT_READFUNCTION
will
be NULL below. For now at least CURLOPT_READDATA will be the input
file and it has to be read all over again. */
curl_global_init( CURL_GLOBAL_ALL );
curl = curl_easy_init();
if ( curl ) {
curl_easy_setopt ( curl, CURLOPT_UPLOAD, 1L );
curl_easy_setopt ( curl, CURLOPT_URL,
"scp://sometest.server.com:22/export/home/debug/drop_things_here/foo.dat");
curl_easy_setopt ( curl, CURLOPT_SSH_PUBLIC_KEYFILE,
ssh_pub_key_file );
curl_easy_setopt ( curl, CURLOPT_SSH_PRIVATE_KEYFILE,
ssh_priv_key_file );
curl_easy_setopt ( curl, CURLOPT_KEYPASSWD,
ssh_pass ); /* note this does not work */
curl_easy_setopt ( curl, CURLOPT_USERPWD,
"username:password"); /* need this .. don't know why */
curl_easy_setopt ( curl, CURLOPT_VERBOSE,
1L );
curl_easy_setopt ( curl, CURLOPT_DEBUGFUNCTION,
my_trace );
curl_easy_setopt ( curl, CURLOPT_DEBUGDATA,
&config );
curl_easy_setopt ( curl,
CURLOPT_NOPROGRESS, 0L );
curl_easy_setopt ( curl,
CURLOPT_SSL_VERIFYPEER, 0L );
curl_easy_setopt ( curl,
CURLOPT_STDERR, logfile );
/* just re-read the file for now */
curl_easy_setopt ( curl,
CURLOPT_READFUNCTION, NULL );
/* supply the file here */
curl_easy_setopt ( curl,
CURLOPT_READDATA, inputdat );
/* using SCP CURLOPT_INFILESIZE is needed */
/* note that CURLOPT_INFILESIZE_LARGE requires type curl_off_t
*/
curl_easy_setopt ( curl, CURLOPT_INFILESIZE,
(long) datfid.st_size );
/* Perform the request, res will get the return code */
res = curl_easy_perform ( curl );
/* Check for errors */
if ( res != CURLE_OK ) {
fprintf ( stderr, "FAIL : curl_easy_perform() failed: %s\n",
curl_easy_strerror ( res ) );
fprintf ( stderr, "FAIL : res = %d (write_error = %d)\n",
res, wr_error );
free ( dat_buffer );
return ( EXIT_FAILURE );
}
/* now extract transfer info */
curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &speed_upload);
curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total_time);
fprintf ( stderr, " %.3f bytes/sec for %.3f secs\n",
speed_upload, total_time);
/*
* we should null terminate the reply
* with some sort of data[write_result.pos] = '\0';
*/
printf( "res = %d (write_error = %d)\n", res, wr_error );
curl_easy_cleanup ( curl );
} else {
printf ( "\nFAIL : curl init fail.\n" );
free ( dat_buffer );
return ( EXIT_FAILURE );
}
curl_global_cleanup();
fflush ( logfile );
fclose ( logfile );
free ( dat_buffer );
return ( EXIT_SUCCESS ) ;
Mostly that is cleaned up for this email but the options and steps are
correct.
Now perhaps I need to check the size of the file and perhaps the
connection ever closes because ... don't know. Any insights are
appreciated.
Dennis
ps: yes .. even though I provide the passphrase I had to resort to
username and password to auth. That's a separate mystery.
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-users
FAQ: http://curl.haxx.se/docs/faq.html
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2014-04-25