На сях. Код не оптимизированный да и сильно не тестировал. Просьба сильно за код не пинать))
Юзает http://kent.dl.sourceforge.net/sourceforge/libssh2/libssh2-0.18.tar.gz
Код:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <libssh2.h>
#define MAX_SIZE 0xff
FILE *f;
char *hostloginpass [3];
int sock;
//LIBSSH2_SESSION *session;
void usage (char *name)
{
printf ("Usage: %s [input_file]\n", name);
}
void clear_file ()
{
fclose (f);
}
void clear_file_and_array ()
{
int i;
fclose (f);
for (i = 0; i < 3; i++)
{
//printf ("LOL: %s\n", hostloginpass [i]);
free (hostloginpass [i]);
}
//clear_file ();
}
void clear_file_and_array_and_socket ()
{
int i;
//printf ("HOST: %s\n", hostloginpass [0]);
close (sock);
fclose (f);
for (i = 0; i < 3; i++)
{
//printf ("LOL: %s\n", hostloginpass [i]);
free (hostloginpass [i]);
}
//clear_file_and_array ();
}
int create_socket (char *host, int port)
{
int s;
struct sockaddr_in sin;
int i = 1, failed = 1;
if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0)
return -1;
memset (&sin, '\0', sizeof (struct sockaddr_in));
sin.sin_family = AF_INET;
sin.sin_port = htons (port);
sin.sin_addr.s_addr = inet_addr (host);
/*if (bind (s, (struct sockaddr *) &sin, sizeof (struct sockaddr_in)) < 0)
return -2;*/
while ((i < 10) && (failed == 1))
{
if (connect (s, (struct sockaddr *) &sin, sizeof (struct sockaddr_in)) < 0)
{
//printf ("I: %d\nFAILED: %d\n", i, failed);
i++;
}
else
failed = 0;
//return -2;
}
//printf ("I: %d\nFAILED: %d\n", i, failed);
if (i == 10)
return -2;
return s;
}
int testlogin (int s, char *login, char *pass)
{
LIBSSH2_SESSION *session;
int res;
char *fp;
session = libssh2_session_init ();
if (libssh2_session_startup (session, s))
{
return -1;
}
/*fp = libssh2_userauth_list (session, login, strlen (login));
printf ("FP: %s\n", fp);*/
if (libssh2_userauth_password (session, login, pass))
res = 0;
else
res = 1;
libssh2_session_free (session);
return res;
}
int main (int argc, char **argv)
{
char fname [MAX_SIZE];
static char line [MAX_SIZE];
int line_count/*, is_first_line = 1*/;
unsigned char i;
char *pline, *find_char;
struct stat st;
FILE *f;
struct sockaddr_in sin;
if (argc != 2)
{
usage (argv [0]);
return 0;
}
bzero (fname, MAX_SIZE);
bzero (&st, sizeof (struct stat));
strncpy (fname, argv [1], strlen (argv [1]));
if ((stat (fname, (struct stat *) &st)) < 0)
{
printf ("%s: stat() error: %s\n", fname, strerror (errno));
return -1;
}
//printf ("STAT: %lo\n", st.st_mode & S_IFREG);
if ((st.st_mode & S_IFREG) != S_IFREG)
{
printf ("%s: not regular file or symlink.\n", fname);
return -1;
}
if ((f = fopen (fname, "r")) == NULL)
{
printf ("%s: open failure. Error: %s\n", fname, strerror (errno));
return -1;
}
while (!feof (f))
{
bzero (line, MAX_SIZE);
if (fgets (line, MAX_SIZE, f) != NULL)
{
if (sizeof (line) > MAX_SIZE)
{
printf ("Segmentation fault :)\n");
fclose (f);
return -1;
}
*(unsigned char *) (line + strlen (line) - 1) = '\0';
/*if (is_first_line)
{
line_count = atoi (line);
is_first_line = 0;
continue;
}*/
pline = find_char = line;
while ((find_char = strchr (find_char, 0x20)) != NULL)
{
(*(unsigned char *) find_char) = '\0';
find_char++;
//printf ("FIND_CHAR: %s\nLINE: %s\n", find_char, pline);
}
//printf ("HOST: %s\n", pline);
//pline += (strlen (pline) + 1);
for (i = 0; i < 3; i++)
{
if ((hostloginpass[i] = calloc (strlen (pline), 1)) == NULL)
{
printf ("calloc() error: %s\n", strerror (errno));
fclose (f);
return -1;
}
strncpy (hostloginpass [i], pline, strlen (pline));
pline += (strlen (pline) + 1);
}
//printf ("USER: %s\n", hostloginpass [2]);
sock = create_socket (hostloginpass [0], 22);
//printf ("USER: %s\n", hostloginpass [0]);
switch (sock)
{
case -1:
printf ("socket1() error: %s\n", strerror (errno));
clear_file_and_array ();
return -1;
break;
case -2:
printf ("socket2() error: %s\n", strerror (errno));
//printf ("USER: %s\n", hostloginpass [0]);
clear_file_and_array_and_socket ();
return -1;
break;
default:
break;
}
//printf ("Socket Created\n");
printf ("Trying %s:%s on host %s... ", hostloginpass [1], hostloginpass [2], hostloginpass [0]);
switch (testlogin (sock, hostloginpass [1], hostloginpass [2]))
{
case -1:
printf ("ssh_connect() error: %s\n", strerror (errno));
clear_file_and_array_and_socket ();
return -1;
break;
case 0:
printf ("- fail\n");
break;
case 1:
printf ("- ok\n");
break;
default:
break;
}
close (sock);
for (i = 0; i < 3; i++)
free (hostloginpass [i]);
//printf ("%s", line);
}
}
fclose (f);
return 0;
}
|