Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

detecter sessions SSH

7 réponses
Avatar
Frederic Beck
Hello

Voila mon probleme : j'ai un programme C et je voudrais d=E9tecter la
pr=E9sence de sessions SSH, cad faire une liste des sessions ouvertes sur
et depuis la machine ou tourne le programme.

J'ai vu qu'avec un ps c'etait possible en shell, mais je ne connais pas
l'eventuel equivalent en C (si qq'un le connait je suis preneur aussi)

merci d'avance
Fred

7 réponses

Avatar
Stephane Bortzmeyer
On Thu, Apr 28, 2005 at 11:14:16AM +0200,
Frederic Beck wrote
a message of 11 lines which said:

J'ai vu qu'avec un ps c'etait possible en shell, mais je ne connais
pas l'eventuel equivalent en C (si qq'un le connait je suis preneur
aussi)



Si vous débutez en C (ce qui semble être le cas puisque vous ne
connaissez pas system(3) ou popen(3)), peut-être vaudrait-il mieux
utiliser Perl ou Python ?




--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Frederic Beck
non c'est pas que je debute, je connais system ou la famille exec, mais
system ne m'arrange pas car je ne peux pas récupérer la sortie

Je n'ai pas franchement envie de coder des pipes (la commande a executer
est "ps axf | grep -v grep | grep -v sshd | grep ssh | wc -l"), donc je
pensais, sois regarder dans un eventuel fichier de log ou autre, mais
j'ai pas trouvé de tel fichier, soit executer un script qui redirige le
resultat dans un fichier, mais alors, que ce soit avec execve, execl ca
plante...

Je vais finir par devoir coder mes pipes je le sens...

On Thu, 28 Apr 2005 11:46:58 +0200
Stephane Bortzmeyer wrote:

On Thu, Apr 28, 2005 at 11:14:16AM +0200,
Frederic Beck wrote
a message of 11 lines which said:

> J'ai vu qu'avec un ps c'etait possible en shell, mais je ne connais
> pas l'eventuel equivalent en C (si qq'un le connait je suis preneur
> aussi)

Si vous débutez en C (ce qui semble être le cas puisque vous ne
connaissez pas system(3) ou popen(3)), peut-être vaudrait-il mieux
utiliser Perl ou Python ?




--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact





Avatar
Stephane Bortzmeyer
On Thu, Apr 28, 2005 at 01:46:49PM +0200,
Frederic Beck wrote
a message of 42 lines which said:

non c'est pas que je debute, je connais system ou la famille exec,
mais system ne m'arrange pas car je ne peux pas récupérer la sortie



Relisez mon message, j'ai mentionné deux fonctions.

Je n'ai pas franchement envie de coder des pipes (la commande a
executer est "ps axf | grep -v grep | grep -v sshd | grep ssh | wc
-l"),



Oui. Où est le problème ?


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Basile STARYNKEVITCH
Le Thu, Apr 28, 2005 at 01:46:49PM +0200, Frederic Beck écrivait/wrote:
non c'est pas que je debute, je connais system ou la famille exec, mais
system ne m'arrange pas car je ne peux pas récupérer la sortie



Utiliser alors popen

FILE* f = popen("ps -p $(pidof ssh)", "r");

> On Thu, Apr 28, 2005 at 11:14:16AM +0200,
> Frederic Beck wrote
> a message of 11 lines which said:
>
> > J'ai vu qu'avec un ps c'etait possible en shell, mais je ne connais
> > pas l'eventuel equivalent en C (si qq'un le connait je suis preneur
> > aussi)
>



L'équivalent en C existe (puisque la commande ps est écrite en C),
mais est spécifique à Linux.

En fait, il suffit de parcourir l'arborescence /proc pour y trouvez
les processus que vous voulez. La libproc le fait. Installez le paquet
libproc-dev sous Debian.

--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net
aliases: basile<at>tunes<dot>org = bstarynk<at>nerim<dot>net
8, rue de la Faïencerie, 92340 Bourg La Reine, France


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Astar0th
Frederic Beck a écrit :
Hello

Voila mon probleme : j'ai un programme C et je voudrais détecter la
présence de sessions SSH, cad faire une liste des sessions ouvertes sur
et depuis la machine ou tourne le programme.

J'ai vu qu'avec un ps c'etait possible en shell, mais je ne connais pas
l'eventuel equivalent en C (si qq'un le connait je suis preneur aussi)

merci d'avance
Fred





salut,

je pense que tu devrais t'orienter vers la commande last, utmp||wtmp au
niveau des man. last utilise les structures décritent dans les man de
utmp et de wtmp. Avec ca tu peux detecter qui est loggué ou a été loggué
et comment (sur quel pts, en local ou non (avec l'adresse ip)) a quelle
heure etc...

bon courage++


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jean-Damien Durand
--nextPart2840783.gxbxsqF3Hu
Content-Type: multipart/mixed;
boundary="Boundary-01=_BdOcCr0+eGmqkh5"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

--Boundary-01=_BdOcCr0+eGmqkh5
Content-Type: text/plain;
charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

En C un peu propre (donc pas de system/exec), comme dit precedemment, libpr oc-dev.

Sinon tu t'amuse toi-meme a scanner /proc. C'est juste (presque tres!) fast idieux.
Pour le fun, je t'ai fais un exemple sans pretention.

Perl et autres, beaucoup plus facile et rapide. C.f. le module Proc::Proces sTable
par example pour perl.

A+, JD.

On Thursday 28 April 2005 13:46, Frederic Beck wrote:
FB > non c'est pas que je debute, je connais system ou la famille exec, m ais
FB > system ne m'arrange pas car je ne peux pas récupérer la sortie

--
Jean-Damien Durand CERN/IT/FIO/DS - Geneva, Switzerland
PGP: http://home.cern.ch/~jdurand/public_key.asc
CERN CA: http://cern.ch/service-grid-ca/crt/root_crt.html
WWW: http://home.cern.ch/~jdurand

--Boundary-01=_BdOcCr0+eGmqkh5
Content-Type: text/x-csrc;
charset="iso-8859-15";
name="sshspy.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="sshspy.c"

/* Basic, stupid and al. example on how to one can use /proc */
/* Fits on systems where ssh pid is _correctly_ launched as a */
/* daemon and stored its pid in /var/run/sshd.pid */

/* cc -Wall -o sshspy sshspy.c; ./sshspy */

#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>

#define SSH_PID "/var/run/sshd.pid"

static int sshspydoit(int);
static char *readlink_malloc(char *);

int main() {
int sshpidfd;
char buf[21];
int sshpid = 0;
int nssh;

/* Recupere sshd pid */
if ((sshpidfd = open(SSH_PID,O_RDONLY)) < 0) {
perror(SSH_PID);
} else {
/* Will it ever be more than 21 bytes !? */
if (read(sshpidfd,buf,21) <= 0) {
perror(SSH_PID);
} else {
memset(buf,20,'');
if ((sshpid = atoi(buf)) <= 0) {
fprintf(stderr,"Negative ssh pid in %s !?n", SSH_PID);
sshpid = 0;
}
close(sshpidfd);
}
}


if (sshpid == 0) {
fprintf(stderr,"Warning - you are likely to match ssh master daemonn");
}

if (getuid() != 0) {
fprintf(stderr,"Warning - you will not match all sessions unless you are rootn");
}

nssh = sshspydoit(sshpid);
fprintf(stdout,"%d ssh session%s foundn", nssh, nssh > 1 ? "s" : "");
exit(EXIT_SUCCESS);
}

static int sshspydoit(sshpid)
int sshpid;
{
int rc = 0;
DIR *proc_dir;

if ((proc_dir = opendir("/proc")) == NULL) {
perror("/proc");
} else {
int proc_dir_return_code;
struct dirent proc_dir_entry;
struct dirent *proc_dir_result;

for (proc_dir_return_code = readdir_r(proc_dir, &proc_dir_entry, &proc_dir_result);
proc_dir_result != NULL && proc_dir_return_code == 0;
proc_dir_return_code = readdir_r(proc_dir, &proc_dir_entry, &proc_dir_result)) {
char *fullpath;
struct stat statbuf;
char *filename;

/* Let's scan entries that have onlt digits */
if (strspn(proc_dir_entry.d_name,"1234567890") != strlen(proc_dir_entry.d_name)) {
continue;
}

/* Master ssh pid !? */
if (atoi(proc_dir_entry.d_name) == sshpid) {
continue;
}

/* We will stat /proc/proc_dir_entry.d_name/exe and /proc/proc_dir_entry.d_name/stat and */
if ((fullpath = (char *) malloc(strlen("/proc/") + strlen(proc_dir_entry.d_name) + strlen("/exe") + 2)) == NULL) {
perror("malloc");
continue;
}

strcpy(fullpath,"/proc/");
strcat(fullpath,proc_dir_entry.d_name);
strcat(fullpath,"/exe");

if (stat(fullpath,&statbuf) == 0) {
/* This is a link - only linux we expect so */
if ((filename = readlink_malloc(fullpath)) != NULL) {
char *p;

/* Ends with "/sshd" ? */
if ((p = strrchr(filename,'/')) != NULL) {
*p++ = '';
if (strcmp(p,"sshd") == 0) {

*--p = '/';

/* Try to open /proc/pid/stat if we know the sshd master */
if (sshpid > 0) {
int fd;

strcpy(fullpath,"/proc/");
strcat(fullpath,proc_dir_entry.d_name);
strcat(fullpath,"/stat");

if ((fd = open(fullpath,O_RDONLY)) >= 0) {
char buf[4097];
/* We are only interested in the token No 4: pid (command) state ppid ... */
/* This cannot exceed 4096 bytes - can it ? */
memset(buf,4096,'');
if (read(fd,buf,4096) > 0) {
char *p;
char *last = NULL;

buf[4096] = '';
/* I hate sscanf - that's all */
if ((p = strtok_r(buf," ",&last)) != NULL) { /* pid */
if ((p = strtok_r(NULL," ",&last)) != NULL) { /* (command) */
if ((p = strtok_r(NULL," ",&last)) != NULL) { /* state */
if ((p = strtok_r(NULL," ",&last)) != NULL) { /* ppid */
int ppid = atoi(p);
if (ppid == sshpid) {
fprintf(stdout,"PID=%s PPID=%d %sn", proc_dir_entry.d_name, ppid, filename);
++rc;
} else if (ppid == 1) {
fprintf(stdout,"PID%s PPID=%d %s (orphaned !?)n", proc_dir_entry.d_name, ppid, filename);
++rc;
}
}
}
}
}
}
close(fd);
}
}
}
}
free(filename);
}
}
free(fullpath);
}
closedir(proc_dir);
}
return(rc);
}

static char *readlink_malloc(filename)
char *filename;
{
int size = 100;

while (1) {
char *buffer = (char *) calloc(size,1);
if (buffer == NULL) {
perror("calloc");
return(NULL);
}
int nchars = readlink (filename, buffer, size);
if (nchars < 0) {
perror(filename);
return(NULL);
}
if (nchars < size) {
return(buffer);
}
free (buffer);
size *= 2;
}
}

--Boundary-01=_BdOcCr0+eGmqkh5--

--nextPart2840783.gxbxsqF3Hu
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Disposition: attachment; filename="smime.p7s"
Content-Transfer-Encoding: base64

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIID+TCCA/Uw
ggLdoAMCAQICAgLyMA0GCSqGSIb3DQEBBAUAMD0xCzAJBgNVBAYTAkNIMQ0wCwYDVQQKEwRDRVJO
MQ0wCwYDVQQLEwRHUklEMRAwDgYDVQQDEwdDRVJOIENBMB4XDTA0MTAwODEwMjYzMloXDTA1MTAw
ODEwMjYzMlowTTELMAkGA1UEBhMCQ0gxDTALBgNVBAoTBENFUk4xDTALBgNVBAsTBEdSSUQxIDAe
BgNVBAMTF0plYW4tRGFtaWVuIER1cmFuZCAzNTYyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQCls+44hmgGNSZxdXATjoSB95SvCv/rymtSafWH6FXykvB5ddMDefjhxAcGr85/fC6oaw2MRYFM
5EhZ0dC9l/J534ICET87SU9JGF9jlNuf0sC3pGUYeSykD9FhTkgYdznX5NqI9TAX57psxGMYl2lI
GERmKVKcKK1wHbUyRjTWWQIDAQABo4IBcTCCAW0wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUyz7n
tOuZ6Yk2wfdVu93Q4zoJFaowHwYDVR0jBBgwFoAU8kruin3jqnkHi9bdO92hpXIyfmowDgYDVR0P
AQH/BAQDAgP4MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9zZXJ2aWNlLWdyaWQtY2Eud2ViLmNl
cm4uY2gvc2VydmljZS1ncmlkLWNhL2NnaS1iaW4vZ2V0Q1JMMCIGA1UdEgQbMBmBF3NlcnZpY2Ut
Z3JpZC1jYUBjZXJuLmNoMBcGA1UdIAQQMA4wDAYKKwYBBAFgCgECAjARBglghkgBhvhCAQEEBAMC
BaAwQgYJYIZIAYb4QgECBDUWM2h0dHA6Ly9zZXJ2aWNlLWdyaWQtY2Eud2ViLmNlcm4uY2gvc2Vy
dmljZS1ncmlkLWNhLzAlBgNVHREEHjAcgRpKZWFuLURhbWllbi5EdXJhbmRAY2Vybi5jaDANBgkq
hkiG9w0BAQQFAAOCAQEAPu9oiqzS7UpmASqg+DitbRqxxUJ3k76bnXknk/heX+2/epCvI1rW/mse
qKW5ar4n6ngjjA9tMz0BAmVXwJ17ia5BEL6CcMR2h6P1q8h7JWGXTlOGaWtxs4wG9g4LoE0zeTxV
NbWE9Lthd3BoLJoFwickbqO18cNuAeY5RunmYC2hwwjVbY9l8nVUihXB7MJr2rcyR9C7YEhDD8PP
DPyeFEOTXAQ9ox544JT5PS7MVngwuDKXmW/NNRUSwYlyRLSR4ryNMVJ6/LwcoHf0YxXHfWn/EdRy
NyGJSAspKRlsukS6eF0E/cGGOqJ19Fj8v42ggJmr5jhzYNB4wYHYEX5+BDGCAXMwggFvAgEBMEMw
PTELMAkGA1UEBhMCQ0gxDTALBgNVBAoTBENFUk4xDTALBgNVBAsTBEdSSUQxEDAOBgNVBAMTB0NF
Uk4gQ0ECAgLyMAcGBSsOAwIaoIGLMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN
AQkFMQ8XDTA1MDQyODEzMzgwOVowIwYJKoZIhvcNAQkEMRYEFAO0U6XO6zoYC6XE0Z2gA0nE1niB
MCwGCSqGSIb3DQEJDzEfMB0wDQYJYIZIAWUDBAECBQAwDAYIKoZIhvcNAwcFADALBgkqhkiG9w0B
AQEEgYBjM8a+8KKewGh7ajXr08l/cVNnTmaAymu1clc/tMC73mrpYOxiZAZILCbMUXb3iUJT2kR0
cxGdzLeAeaZZz7BLZXYDpkLkWLjRMUzewNGdH9CZG5OqnD5Ei49a0VIcA283FOpND+IWxu1Yr6AJ
JSfu8fiD/cvBQOUeKN9VH98nXgAAAAAAAA=
--nextPart2840783.gxbxsqF3Hu--


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Alexis Français
Bonjour.

Le fichier de logs gérant toutes les connections est /var/log/auth.log
Il faudra cependant lui appliquer un filtre via un grep sshd.

On peut ainsi connaître toutes les tentatives de connection à ce service.
En espérant que ça aide.

Cordialement.
--
Alexis Français
aka Sano
JID:


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact