示例#1
0
// Listen for incoming SSH connections.
// When a connection is established, write all data received to stdout.
void server_pipe(char *host, int port)
{
    ssh_bind b = ssh_bind_new();
    ssh_session s = ssh_new();
    ssh_bind_options_set(b, SSH_BIND_OPTIONS_BINDADDR, host);
    ssh_bind_options_set(b, SSH_BIND_OPTIONS_BINDPORT, &port);
    ssh_bind_options_set(b, SSH_BIND_OPTIONS_RSAKEY, "test-server-key");
    ssh_bind_options_set(b, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, "5");
    if(ssh_bind_listen(b) < 0)
        session_error(b, "listen");
    if(ssh_bind_accept(b, s) != SSH_OK)
        session_error(b, "accept");
    if(ssh_accept(s) < 0)
        session_error(s, "handshake");
    
    int state = SERVER_CONNECTED;
    while(1)
    {
        ssh_message m = ssh_message_get(s);
        if(m)
        {
            int type = ssh_message_type(m);
            int subtype = ssh_message_subtype(m);
            ssh_message_auth_set_methods(m, SSH_AUTH_METHOD_PUBLICKEY);
            server_handle_message(s, m, type, subtype, &state);
            ssh_message_free(m);
            if(state == SERVER_CLOSED)
            {
                ssh_disconnect(s);
                ssh_bind_free(b);
                ssh_finalize();
                return;
            }
        }
        else
        {
            session_error(s, "session");
        }
    }
}
示例#2
0
int main(int argc, char **argv){
    SSH_OPTIONS *options=ssh_options_new();
    SSH_SESSION *session;
    SSH_BIND *ssh_bind;
    CHANNEL *chan=NULL;
    SFTP_SESSION *sftp=NULL;
    int ret;
    int donotfork=0;
    char *config="mercurius.conf";
    ssh_options_getopt(options,&argc,argv);
    while((ret=getopt(argc, argv, "Df:"))!=-1){
        switch(ret){
            case 'D':
                donotfork=1;
                break;
            case 'f':
                config=strdup(optarg);
                break;
            case '?':
                usage(argv[0]);
                exit(1);
        }
    }
    if(optind<argc) {
        usage(argv[0]);
        exit(1);
    }
    ret=parse_config(config);
    if(ret != 0){
        printf("Error parsing configuration file\n");
        return 1;
    }
    if(!rsa && !dsa){
        printf("There must be at least one RSA or DSA host key\n");
        return 1;
    }
    if(dsa)
        ssh_options_set_dsa_server_key(options,dsa);
    if(rsa)
        ssh_options_set_rsa_server_key(options,rsa);
    //printf("port : %d\n",port);
    if(port!=0)
        ssh_options_set_port(options,port);
    ssh_bind=ssh_bind_new();
    ssh_bind_set_options(ssh_bind,options);
    if(ssh_bind_listen(ssh_bind)<0){
        printf("Error listening to socket: %s\n",ssh_get_error(ssh_bind));
        return 1;
    }
    signal(SIGCHLD,SIG_IGN);
    if(!donotfork){
        ssh_say(1,"Going into background...\n");
        if(fork()){
            exit(0);
        }
    }
    while(1){
        session=ssh_bind_accept(ssh_bind);
        if(!session){
            printf("error accepting a connection : %s\n",ssh_get_error(ssh_bind));
            return 1;
        }
        if(fork()==0){
            break;
        }
        ssh_silent_disconnect(session);
    }
    ssh_bind_free(ssh_bind);
    
    //printf("Socket connected : %d\n",ssh_get_fd(session));
    if(ssh_accept(session)){
        printf("ssh_accept : %s\n",ssh_get_error(session));
        return 1;
    }
    if(do_auth(session)<0){
        printf("error : %s\n",ssh_get_error(session));
        return 1;
    }
    ssh_say(1,"user authenticated\n");
    chan=recv_channel(session);
    if(!chan){
        printf("error : %s\n",ssh_get_error(session));
        return 1;
    }
    sftp=sftp_server_new(session,chan);
    if(sftp_server_init(sftp)){
        printf("error : %s\n",ssh_get_error(session));
        return 1;
    }
    ssh_say(1,"Sftp session open by client\n");
    sftploop(session,sftp);
    ssh_say(1,"Client disconnected\n");
    ssh_disconnect(session);
    return 0;
}