int main(int argc, char **argv){ ssh_session session; session = ssh_new(); if(ssh_options_getopt(session, &argc, argv)) { fprintf(stderr, "error parsing command line :%s\n", ssh_get_error(session)); usage(); } opts(argc,argv); #ifdef WITH_PCAP set_pcap(session); #endif client(session); ssh_disconnect(session); ssh_free(session); #ifdef WITH_PCAP cleanup_pcap(); #endif ssh_finalize(); return 0; }
int ssh_main(int argc, char **argv){ ssh_session session; session = ssh_new(); ssh_callbacks_init(&cb); ssh_set_callbacks(session,&cb); if(ssh_options_getopt(session, &argc, argv)) { fprintf(stderr, "error parsing command line :%s\n", ssh_get_error(session)); usage(); } opts(argc,argv); signal(SIGTERM, do_exit); set_pcap(session); client(session); ssh_disconnect(session); ssh_free(session); cleanup_pcap(); ssh_finalize(); return 0; }
int main(int argc, char **argv){ ssh_session session; ssh_bind sshbind; ssh_message message; ssh_channel chan=0; char buf[2048]; int auth=0; int sftp=0; int i; int r; sshbind=ssh_bind_new(); session=ssh_new(); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER "ssh_host_dsa_key"); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER "ssh_host_rsa_key"); #ifdef HAVE_ARGP_H /* * Parse our arguments; every option seen by parse_opt will * be reflected in arguments. */ argp_parse (&argp, argc, argv, 0, 0, sshbind); #else (void) argc; (void) argv; #endif #ifdef WITH_PCAP set_pcap(session); #endif if(ssh_bind_listen(sshbind)<0){ printf("Error listening to socket: %s\n",ssh_get_error(sshbind)); return 1; } r=ssh_bind_accept(sshbind,session); if(r==SSH_ERROR){ printf("error accepting a connection : %s\n",ssh_get_error(sshbind)); return 1; } if (ssh_handle_key_exchange(session)) { printf("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); return 1; } do { message=ssh_message_get(session); if(!message) break; switch(ssh_message_type(message)){ case SSH_REQUEST_AUTH: switch(ssh_message_subtype(message)){ case SSH_AUTH_METHOD_PASSWORD: printf("User %s wants to auth with pass %s\n", ssh_message_auth_user(message), ssh_message_auth_password(message)); if(auth_password(ssh_message_auth_user(message), ssh_message_auth_password(message))){ auth=1; ssh_message_auth_reply_success(message,0); break; } // not authenticated, send default message case SSH_AUTH_METHOD_NONE: default: ssh_message_auth_set_methods(message,SSH_AUTH_METHOD_PASSWORD); ssh_message_reply_default(message); break; } break; default: ssh_message_reply_default(message); } ssh_message_free(message); } while (!auth); if(!auth){ printf("auth error: %s\n",ssh_get_error(session)); ssh_disconnect(session); return 1; } do { message=ssh_message_get(session); if(message){ switch(ssh_message_type(message)){ case SSH_REQUEST_CHANNEL_OPEN: if(ssh_message_subtype(message)==SSH_CHANNEL_SESSION){ chan=ssh_message_channel_request_open_reply_accept(message); break; } default: ssh_message_reply_default(message); } ssh_message_free(message); } } while(message && !chan); if(!chan){ printf("error : %s\n",ssh_get_error(session)); ssh_finalize(); return 1; } do { message=ssh_message_get(session); if(message && ssh_message_type(message)==SSH_REQUEST_CHANNEL && ssh_message_subtype(message)==SSH_CHANNEL_REQUEST_SHELL){ // if(!strcmp(ssh_message_channel_request_subsystem(message),"sftp")){ sftp=1; ssh_message_channel_request_reply_success(message); break; // } } if(!sftp){ ssh_message_reply_default(message); } ssh_message_free(message); } while (message && !sftp); if(!sftp){ printf("error : %s\n",ssh_get_error(session)); return 1; } printf("it works !\n"); do{ i=ssh_channel_read(chan,buf, 2048, 0); if(i>0) { ssh_channel_write(chan, buf, i); if (write(1,buf,i) < 0) { printf("error writing to buffer\n"); return 1; } } } while (i>0); ssh_disconnect(session); ssh_bind_free(sshbind); #ifdef WITH_PCAP cleanup_pcap(); #endif ssh_finalize(); return 0; }
int main(int argc, char **argv){ ssh_session session; ssh_bind sshbind; ssh_message message; ssh_channel chan=0; char buf[2048]; int auth=0; int shell=0; int i; int r; sshbind=ssh_bind_new(); session=ssh_new(); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER "ssh_host_dsa_key"); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER "ssh_host_rsa_key"); #ifdef HAVE_ARGP_H /* * Parse our arguments; every option seen by parse_opt will * be reflected in arguments. */ argp_parse (&argp, argc, argv, 0, 0, sshbind); #else (void) argc; (void) argv; #endif #ifdef WITH_PCAP set_pcap(session); #endif if(ssh_bind_listen(sshbind)<0){ printf("Error listening to socket: %s\n", ssh_get_error(sshbind)); return 1; } printf("Started sample libssh sshd on port %d\n", port); printf("You can login as the user %s with the password %s\n", SSHD_USER, SSHD_PASSWORD); r = ssh_bind_accept(sshbind, session); if(r==SSH_ERROR){ printf("Error accepting a connection: %s\n", ssh_get_error(sshbind)); return 1; } if (ssh_handle_key_exchange(session)) { printf("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); return 1; } /* proceed to authentication */ auth = authenticate(session); if (!auth || !authenticated) { printf("Authentication error: %s\n", ssh_get_error(session)); ssh_disconnect(session); return 1; } /* wait for a channel session */ do { message = ssh_message_get(session); if(message){ if(ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(message) == SSH_CHANNEL_SESSION) { chan = ssh_message_channel_request_open_reply_accept(message); ssh_message_free(message); break; } else { ssh_message_reply_default(message); ssh_message_free(message); } } else { break; } } while(!chan); if(!chan) { printf("Error: cleint did not ask for a channel session (%s)\n", ssh_get_error(session)); ssh_finalize(); return 1; } /* wait for a shell */ do { message = ssh_message_get(session); if(message != NULL) { if(ssh_message_type(message) == SSH_REQUEST_CHANNEL && ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL) { shell = 1; ssh_message_channel_request_reply_success(message); ssh_message_free(message); break; } ssh_message_reply_default(message); ssh_message_free(message); } else { break; } } while(!shell); if(!shell) { printf("Error: No shell requested (%s)\n", ssh_get_error(session)); return 1; } printf("it works !\n"); do{ i=ssh_channel_read(chan,buf, 2048, 0); if(i>0) { if(*buf == '' || *buf == '') break; if(i == 1 && *buf == '\r') ssh_channel_write(chan, "\r\n", 2); else ssh_channel_write(chan, buf, i); if (write(1,buf,i) < 0) { printf("error writing to buffer\n"); return 1; } } } while (i>0); ssh_channel_close(chan); ssh_disconnect(session); ssh_bind_free(sshbind); #ifdef WITH_PCAP cleanup_pcap(); #endif ssh_finalize(); return 0; }
int SSHThread( void *data ) { // TODO: Hogne was here, disabling this problem child.. :) return 0; #ifdef ENABLE_SSH ssh_session session = NULL; ssh_bind sshbind = NULL; ssh_event mainloop; struct ssh_server_callbacks_struct cb = { .userdata = NULL, .auth_password_function = auth_password, .auth_gssapi_mic_function = auth_gssapi_mic, .channel_open_request_session_function = new_session_channel }; char buf[2048]; int i; int r; DEBUG("Starting SSH Process\n"); SSHServer *ts = (SSHServer *)data; if( !ts ) return 0; ts->sshs_FriendHome = getenv( "FRIEND_HOME" ); int len = strlen( ts->sshs_FriendHome ); ts->sshs_RSAKeyHome = calloc( len+64, sizeof(char) ); ts->sshs_DSAKeyHome = calloc( len+64, sizeof(char) ); strcpy( ts->sshs_RSAKeyHome, ts->sshs_FriendHome ); strcpy( ts->sshs_DSAKeyHome, ts->sshs_FriendHome ); strcat( ts->sshs_RSAKeyHome, "keys/ssh_host_rsa_key" ); strcat( ts->sshs_DSAKeyHome, "keys/ssh_host_dsa_key" ); //DEBUG("SSH sshs_RSAKeyHome set to %s\n", ts->sshs_RSAKeyHome ); sshbind = ssh_bind_new(); BOOL welcomeMessage = FALSE; ssh_bind_options_set( sshbind, SSH_BIND_OPTIONS_DSAKEY, ts->sshs_DSAKeyHome ); ssh_bind_options_set( sshbind, SSH_BIND_OPTIONS_RSAKEY, ts->sshs_RSAKeyHome ); //ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg); //DEBUG("IMPORT RSA KEY %s\n", ts->sshs_RSAKeyHome ); ssh_bind_options_set( sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, SSH_SERVER_PORT ); //verbose ssh_bind_options_set( sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, "2" ); ssh_bind_options_set( sshbind, SSH_BIND_OPTIONS_BINDADDR, "127.0.0.1" ); if( ts->sshs_RSAKeyHome ) free( ts->sshs_RSAKeyHome ); if( ts->sshs_DSAKeyHome ) free( ts->sshs_DSAKeyHome ); // TODO: ts->sshs_Quit sometimes can not be read! while( ts != NULL && !ts->sshs_Quit ) { DEBUG("Server options set\n"); #ifdef WITH_PCAP set_pcap(session); #endif DEBUG("Server before bind\n"); if( ssh_bind_listen( sshbind )<0 ) { ERROR("Error listening to socket: %s\n",ssh_get_error(sshbind) ); break; } DEBUG("Server before accept\n"); session=ssh_new(); r = ssh_bind_accept( sshbind , session ); if( r==SSH_ERROR ) { ERROR("error accepting a connection : %s\n",ssh_get_error(sshbind)); break; } ssh_callbacks_init( &cb ); SSHSession *sess = calloc( 1, sizeof( SSHSession ) ); sess->sshs_Session = session; cb.userdata = sess; DEBUG("User data set\n"); ssh_set_server_callbacks( session, &cb ); if ( ssh_handle_key_exchange( session ) ) { ERROR("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); continue; //goto disconnect; } DEBUG("Connection accepted\n"); ssh_set_auth_methods( session,SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_GSSAPI_MIC ); // // New session/connection put it into thread // switch( fork() ) { case 0: // Remove the SIGCHLD handler inherited from parent signal(SIGCHLD, SIG_DFL); mainloop = ssh_event_new(); ssh_event_add_session( mainloop, session ); while( !(sess->sshs_Authenticated && sess->sshs_Chan != NULL) ) { if( sess->sshs_Error ) { ERROR("SSHSession error %d\n", sess->sshs_Error ); break; } r = ssh_event_dopoll( mainloop, -1 ); if( r == SSH_ERROR ) { ERROR("Error : %s\n",ssh_get_error( session ) ); ssh_disconnect( session ); return 1; } strcpy( buf, "------------------------------------------------------\n\r" \ "--- Welcome in FC server, use help to work with me ---\n\r" \ "------------------------------------------------------\n\r" ); ssh_channel_write( sess->sshs_Chan, buf, strlen( buf ) ); if( sess->sshs_Path == NULL ) { sess->sshs_Path = calloc( 1024, sizeof(char) ); sess->sshs_DispText = calloc( 1024+48, sizeof(char) ); } strcpy( sess->sshs_Path, "/" ); if( sess->sshs_Usr ) { sprintf( sess->sshs_DispText, "%s:%s ", sess->sshs_Usr->u_Name, sess->sshs_Path ); }else{ sprintf( sess->sshs_DispText, ":%s ", sess->sshs_Path ); } int i = 0; do { ssh_channel_write( sess->sshs_Chan, sess->sshs_DispText, strlen( sess->sshs_DispText ) ); i = ssh_channel_read( sess->sshs_Chan, buf, 2048, 0 ); if( i > 0 ) { DEBUG("READING FROM CHANNEL %d - size %d %d %c -n %d\n", i, strlen( buf ), buf[0], buf[0], '\n' ); //ssh_channel_write( sess->sshs_Chan, buf, 1 ); handleSSHCommands( sess, buf, i ); } if( sess->sshs_Quit ) { break; } } while( i>0 ); if( sess->sshs_Quit ) break; } DEBUG("Closing ssh connection\n"); ssh_event_free( mainloop ); ssh_disconnect( session ); ssh_free( session ); if( sess->sshs_DispText ) { FFree( sess->sshs_DispText ); } if( sess->sshs_Path ) { FFree( sess->sshs_Path ); } DEBUG("Connection released\n"); FFree( sess ); abort(); DEBUG("AUTH\n"); break; case -1: ERROR("Cannot create fork!\n"); break; } #ifdef WITH_PCAP cleanup_pcap(); #endif } // main loop disconnect: DEBUG("DISCONNECTED\n"); #endif // ENABLE_SSH return 0; }