Finger
Origem: Wikipédia, a enciclopédia livre.
Índice |
[editar] Introdução ao Finger
O Finger é um comando de troca de informação sobre utilizadores. O protocolo descrito no RFC é um protocolo muito simples que permite aceder à informação sobre utilizadores de uma maquina remota. (o comando Finger também funciona numa maquina local, efectuando pedidos sobre utilizadores à própria maquina. Mas neste caso não é usado o protocolo de comunicação de redes)
De uma forma genérica o funcionamento do Finger resume-se a efectuar uma conexão à porta 79 do servidor, e a realizar um pedido. O servidor envia a resposta de acordo com os dados do pedido.
Os dados enviados são em formato ASCII com os códigos de CR e LF no final.
[editar] O RFC
O RFC usado para implementar este trabalho foi o RFC 1288, escrito em Dezembro de 1991. Este RFC actualiza os RFCs 1196, 1194 e 742.
[editar] O Buffer formatado
O Buffer que recebe os resultados do finger, pode ser imediatamente impresso no écran sem necessidade de tratamento, uma vez que os dados já se encontram formatados.
[editar] Implementacao do cliente Finger
// - 0 finger do ISEP // para testar - server: gnu.org users: karl, pot #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define BUFLEN 30000 main (int argc, char *argv[]) { struct sockaddr_in target; struct hostent *he; struct servent *sp; int sock, nread; char *tmp, buffer[BUFLEN]; char server[100], user[20]; int i; if (argc==1) { puts ("Sintaxe do Programa: ifinger [user] server\n"); printf ("Servername: "); fgets (server, BUFLEN, stdin); tmp = index (server, '\n'); *tmp = '\0'; printf ("Username: (ENTER=todos) "); fgets (user, 20, stdin); } if (argc==3) { strcpy (server,argv[2]); strcpy (user, argv[1]); strcat (user,"\r\n"); } if (argc==2) { strcpy (server,argv[1]); strcpy (user, "\r\n"); } if ((he = gethostbyname (server)) == NULL) { perror ("ERRO: nao encontra server"); exit (1); } if ((sock = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("ERRO: nao criou socket"); exit (1); } if ((sp = getservbyname ("finger", "tcp")) == NULL) { perror ("ERRO: nao encontra porta"); exit (1); } bzero (&target, sizeof (target)); target.sin_family = AF_INET; // target.sin_port = 79; target.sin_port = sp->s_port; target.sin_addr = *((struct in_addr *) he->h_addr); if (connect (sock, (struct sockaddr *) &target, sizeof (target)) < 0) { perror ("ERRO: na conexao"); exit (1); } nread = strlen (user); nread = write (sock, user, nread); nread = read (sock, buffer, BUFLEN); printf ("Resultado: \n\n %s", buffer); close (sock); exit(0); }
[editar] Os testes
Para testar o programa que desenvolvemos, tivemos de encontrar um servidor que aceitasse pedidos de finger. Depois de muita pesquisa encontramos que aceita esse tipo de pedidos e foi este o usado para os nossos testes SERVIDOR: gnu.org
Durante o desenvolvimento e os testes encontramos alguns utilizadores do sistema que poderão servir para efectuar testes:
- Utilizadores: jao, pot.
- Existem também muitos utilizadores com o nome “Karl”