diff options
-rw-r--r-- | examples/ssh_client.c | 321 |
1 files changed, 186 insertions, 135 deletions
diff --git a/examples/ssh_client.c b/examples/ssh_client.c index 53f7f6c4..b0c5a7ff 100644 --- a/examples/ssh_client.c +++ b/examples/ssh_client.c @@ -48,12 +48,17 @@ static char *user; static char *cmds[MAXCMD]; static struct termios terminal; -static char *pcap_file=NULL; +static char *pcap_file = NULL; static char *proxycommand; -static int auth_callback(const char *prompt, char *buf, size_t len, - int echo, int verify, void *userdata) { +static int auth_callback(const char *prompt, + char *buf, + size_t len, + int echo, + int verify, + void *userdata) +{ (void) verify; (void) userdata; @@ -61,11 +66,12 @@ static int auth_callback(const char *prompt, char *buf, size_t len, } struct ssh_callbacks_struct cb = { - .auth_function=auth_callback, - .userdata=NULL + .auth_function = auth_callback, + .userdata = NULL, }; -static void add_cmd(char *cmd){ +static void add_cmd(char *cmd) +{ int n; for (n = 0; (n < MAXCMD) && cmds[n] != NULL; n++); @@ -73,7 +79,8 @@ static void add_cmd(char *cmd){ if (n == MAXCMD) { return; } - cmds[n]=strdup(cmd); + + cmds[n] = strdup(cmd); } static void usage(void) @@ -98,37 +105,43 @@ static void usage(void) exit(0); } -static int opts(int argc, char **argv){ +static int opts(int argc, char **argv) +{ int i; -// for(i=0;i<argc;i++) -// printf("%d : %s\n",i,argv[i]); - /* insert your own arguments here */ - while((i=getopt(argc,argv,"T:P:"))!=-1){ + + while((i = getopt(argc,argv,"T:P:")) != -1) { switch(i){ - case 'P': - pcap_file=optarg; - break; + case 'P': + pcap_file = optarg; + break; #ifndef _WIN32 - case 'T': - proxycommand=optarg; + case 'T': + proxycommand = optarg; break; #endif - default: - fprintf(stderr,"unknown option %c\n",optopt); - usage(); + default: + fprintf(stderr, "Unknown option %c\n", optopt); + usage(); } } - if(optind < argc) - host=argv[optind++]; - while(optind < argc) + if (optind < argc) { + host = argv[optind++]; + } + + while(optind < argc) { add_cmd(argv[optind++]); - if(host==NULL) + } + + if (host == NULL) { usage(); + } + return 0; } #ifndef HAVE_CFMAKERAW -static void cfmakeraw(struct termios *termios_p){ +static void cfmakeraw(struct termios *termios_p) +{ termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); termios_p->c_oflag &= ~OPOST; termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); @@ -138,44 +151,53 @@ static void cfmakeraw(struct termios *termios_p){ #endif -static void do_cleanup(int i) { +static void do_cleanup(int i) +{ /* unused variable */ (void) i; - tcsetattr(0,TCSANOW,&terminal); + tcsetattr(0, TCSANOW, &terminal); } -static void do_exit(int i) { - /* unused variable */ - (void) i; +static void do_exit(int i) +{ + /* unused variable */ + (void) i; - do_cleanup(0); - exit(0); + do_cleanup(0); + exit(0); } -ssh_channel chan; -int signal_delayed=0; +static ssh_channel chan; +static int signal_delayed = 0; -static void sigwindowchanged(int i){ - (void) i; - signal_delayed=1; +static void sigwindowchanged(int i) +{ + (void) i; + signal_delayed = 1; } -static void setsignal(void){ +static void setsignal(void) +{ signal(SIGWINCH, sigwindowchanged); - signal_delayed=0; + signal_delayed = 0; } -static void sizechanged(void){ - struct winsize win = { 0, 0, 0, 0 }; +static void sizechanged(void) +{ + struct winsize win = { + .ws_row = 0, + }; + ioctl(1, TIOCGWINSZ, &win); ssh_channel_change_pty_size(chan,win.ws_col, win.ws_row); -// printf("Changed pty size\n"); setsignal(); } -static void select_loop(ssh_session session,ssh_channel channel){ +static void select_loop(ssh_session session,ssh_channel channel) +{ ssh_connector connector_in, connector_out, connector_err; + ssh_event event = ssh_event_new(); /* stdin */ @@ -196,9 +218,10 @@ static void select_loop(ssh_session session,ssh_channel channel){ ssh_connector_set_in_channel(connector_err, channel, SSH_CONNECTOR_STDERR); ssh_event_add_connector(event, connector_err); - while(ssh_channel_is_open(channel)){ - if(signal_delayed) + while (ssh_channel_is_open(channel)) { + if (signal_delayed) { sizechanged(); + } ssh_event_dopoll(event, 60000); } ssh_event_remove_connector(event, connector_in); @@ -213,121 +236,148 @@ static void select_loop(ssh_session session,ssh_channel channel){ ssh_channel_free(channel); } -static void shell(ssh_session session){ +static void shell(ssh_session session) +{ ssh_channel channel; struct termios terminal_local; int interactive=isatty(0); channel = ssh_channel_new(session); - if(interactive){ - tcgetattr(0,&terminal_local); - memcpy(&terminal,&terminal_local,sizeof(struct termios)); + + if (interactive) { + tcgetattr(0, &terminal_local); + memcpy(&terminal, &terminal_local, sizeof(struct termios)); } - if(ssh_channel_open_session(channel)){ - printf("error opening channel : %s\n",ssh_get_error(session)); + + if (ssh_channel_open_session(channel)) { + printf("Error opening channel : %s\n", ssh_get_error(session)); return; } - chan=channel; - if(interactive){ + chan = channel; + if (interactive) { ssh_channel_request_pty(channel); sizechanged(); } - if(ssh_channel_request_shell(channel)){ - printf("Requesting shell : %s\n",ssh_get_error(session)); + + if (ssh_channel_request_shell(channel)) { + printf("Requesting shell : %s\n", ssh_get_error(session)); return; } - if(interactive){ + + if (interactive) { cfmakeraw(&terminal_local); - tcsetattr(0,TCSANOW,&terminal_local); + tcsetattr(0, TCSANOW, &terminal_local); setsignal(); } - signal(SIGTERM,do_cleanup); - select_loop(session,channel); - if(interactive) - do_cleanup(0); + signal(SIGTERM, do_cleanup); + select_loop(session, channel); + if (interactive) { + do_cleanup(0); + } } -static void batch_shell(ssh_session session){ +static void batch_shell(ssh_session session) +{ ssh_channel channel; char buffer[1024]; - int i,s=0; - for(i=0;i<MAXCMD && cmds[i];++i) { - s+=snprintf(buffer+s,sizeof(buffer)-s,"%s ",cmds[i]); - free(cmds[i]); - cmds[i] = NULL; - } - channel=ssh_channel_new(session); + size_t i; + int s = 0; + + for (i = 0; i < MAXCMD && cmds[i]; ++i) { + s += snprintf(buffer + s, sizeof(buffer) - s, "%s ", cmds[i]); + free(cmds[i]); + cmds[i] = NULL; + } + + channel = ssh_channel_new(session); ssh_channel_open_session(channel); - if(ssh_channel_request_exec(channel,buffer)){ - printf("error executing \"%s\" : %s\n",buffer,ssh_get_error(session)); + if (ssh_channel_request_exec(channel, buffer)) { + printf("Error executing '%s' : %s\n", buffer, ssh_get_error(session)); return; } - select_loop(session,channel); + select_loop(session, channel); } -static int client(ssh_session session){ - int auth=0; - char *banner; - int state; - if (user) - if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) - return -1; - if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0) - return -1; - if (proxycommand != NULL){ - if(ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, proxycommand)) - return -1; - } - ssh_options_parse_config(session, NULL); - - if(ssh_connect(session)){ - fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session)); - return -1; - } - state=verify_knownhost(session); - if (state != 0) - return -1; - ssh_userauth_none(session, NULL); - banner=ssh_get_issue_banner(session); - if(banner){ - printf("%s\n",banner); - free(banner); - } - auth=authenticate_console(session); - if(auth != SSH_AUTH_SUCCESS){ - return -1; - } - if(!cmds[0]) - shell(session); - else - batch_shell(session); - return 0; +static int client(ssh_session session) +{ + int auth = 0; + char *banner; + int state; + + if (user) { + if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) { + return -1; + } + } + if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0) { + return -1; + } + if (proxycommand != NULL) { + if (ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, proxycommand)) { + return -1; + } + } + ssh_options_parse_config(session, NULL); + + if (ssh_connect(session)) { + fprintf(stderr, "Connection failed : %s\n", ssh_get_error(session)); + return -1; + } + + state = verify_knownhost(session); + if (state != 0) { + return -1; + } + + ssh_userauth_none(session, NULL); + banner = ssh_get_issue_banner(session); + if (banner) { + printf("%s\n", banner); + free(banner); + } + auth = authenticate_console(session); + if (auth != SSH_AUTH_SUCCESS) { + return -1; + } + if (cmds[0] == NULL) { + shell(session); + } else { + batch_shell(session); + } + + return 0; } -ssh_pcap_file pcap; -void set_pcap(ssh_session session); -void set_pcap(ssh_session session){ - if(!pcap_file) - return; - pcap=ssh_pcap_file_new(); - if(!pcap) - return; - if(ssh_pcap_file_open(pcap,pcap_file) == SSH_ERROR){ - printf("Error opening pcap file\n"); - ssh_pcap_file_free(pcap); - pcap=NULL; - return; - } - ssh_set_pcap_file(session,pcap); +static ssh_pcap_file pcap; +static void set_pcap(ssh_session session) +{ + if (pcap_file == NULL) { + return; + } + + pcap = ssh_pcap_file_new(); + if (pcap == NULL) { + return; + } + + if (ssh_pcap_file_open(pcap, pcap_file) == SSH_ERROR) { + printf("Error opening pcap file\n"); + ssh_pcap_file_free(pcap); + pcap = NULL; + return; + } + ssh_set_pcap_file(session, pcap); } -void cleanup_pcap(void); -void cleanup_pcap(){ - if(pcap) - ssh_pcap_file_free(pcap); - pcap=NULL; +static void cleanup_pcap(void) +{ + if (pcap != NULL) { + ssh_pcap_file_free(pcap); + } + pcap = NULL; } -int main(int argc, char **argv){ +int main(int argc, char **argv) +{ ssh_session session; session = ssh_new(); @@ -335,12 +385,13 @@ int main(int argc, char **argv){ 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(); + if (ssh_options_getopt(session, &argc, argv)) { + fprintf(stderr, + "Error parsing command line: %s\n", + ssh_get_error(session)); + usage(); } - opts(argc,argv); + opts(argc, argv); signal(SIGTERM, do_exit); set_pcap(session); |