Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 4, 2012 01:44:30

Morkan
Зарегистрирован: 2012-04-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

Если кто подскажет, буду крайне признателен)
Задача следующая - Приложение, обнаруживающее именованные каналы и локальные сокеты, не открытые ни одним процессом.

Теперь к тому что получилось)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import glob
import re
from stat import *
def get_process_name_by_pid(pid, onlyName=False):
    cmdLineFile = open('/proc/' + str(pid) + '/cmdline', 'r')
    cmdLine = cmdLineFile.readline()
    cmdLineFile.close()
    
    if onlyName:
        return os.path.split(cmdLine.split('\x00')[0])[1]
    else:
        return ''.join([(char if char != '\x00' else ' ') for char in cmdLine])
def get_pipes_in_proc():
    pipesInProc = []
    for path in glob.glob('/proc/[0-9]*/fd/*'):
        try:
            mode = os.stat(path).st_mode
            if S_ISFIFO(mode):
                pid = int(re.search('[0-9]+', path).group(0))
                pipesInProc.append((get_process_name_by_pid(pid, True), path))
        except:
            pass
    
    return pipesInProc
def get_sockets_in_proc():
    socketsInProc = []
    for path in glob.glob('/proc/[0-9]*/fd/*'):
        try:
            mode = os.stat(path).st_mode
            if S_ISSOCK(mode):
                pid = int(re.search('[0-9]+', path).group(0))
                socketsInProc.append((get_process_name_by_pid(pid, True), path))
        except:
            pass
    
    return socketsInProc
def get_pipes_in_fs():
    ''' NOT WORK! '''
    pipesInFS = []
    for root, subFolders, fileNames in os.walk('/'):
        for fileName in fileNames:
            path = os.path.join(root, fileName)
            if path[0:6] == '/proc/': break
            try:
                mode = os.stat(path).st_mode
                if S_ISFIFO(mode):
                    pid = int(re.search('[0-9]+', path).group(0))
                    pipesInFS.append((get_process_name_by_pid(pid, True), path))
            except:
                pass
    return pipesInFS
def pretty_print(l, tableName=''):
    maxPnLen = max([len(x[0]) for x in l])
    print '============' + (maxPnLen - 8) * '=' + '===================='
    print '                        ' + tableName
    print ' process name' + (maxPnLen - 8) * ' ' + 'path (symlink)'
    print '============' + (maxPnLen - 8) * '=' + '===================='
    for pn, path in l:
        print str(pn) + (maxPnLen - len(pn) + 4)*' ' + str(path)
if __name__ == '__main__':
    pipes = get_pipes_in_proc()
    pretty_print(pipes, 'Pipes')
    sockets = get_sockets_in_proc()
    pretty_print(sockets, 'Sockets')
	

Если я правильно понял, то все обнаруженные мною named pipe и сокеты в /proc имеют свой процесс. Значит надо искать тоже самое по всей системе,и если будет найден канал или сокет которого нету в /proc значит как раз его процесс и помер, забыв убить своё порождение?) Это если я правильно понял теорию)

def get_pipes_in_fs() не находит нигде никаких пайпов по системе (доступ в проц ему закрыт)…

Если кто понял ход моих мыслей, подскажите плз,а то я совершенно запутался (((

Офлайн

#2 Апрель 4, 2012 13:53:11

Morkan
Зарегистрирован: 2012-04-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

Может кто помочь? очень нужно

Офлайн

#3 Апрель 4, 2012 21:41:44

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

А можно поподробнее почему открытые пайпы должны быть непонятно где на файловой системе?



Офлайн

#4 Апрель 4, 2012 23:12:44

Morkan
Зарегистрирован: 2012-04-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

Ed
Задание такое ( По сути щас мало кто вообще использует пайпы…

Вот топориком на коленке сделал:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
from stat import *
for root, subFolders, fileNames in os.walk('/'):
    for fileName in fileNames:
        path = os.path.join(root, fileName)
	if path[0:6] == '/proc/': break
	elif path[0:6] == '/host/': break
	try:
        	mode = os.stat(path).st_mode
        	if S_ISFIFO(mode):
           		print path
			if subprocess.call('lsof | grep '+path, shell=True):
				print 'kill the pipe!!!'
	    		else:
				print 'all pipe have process'
	except:
            pass
Криво, но вроде находит. Когда пайп не используется и просто как файл на диске lsof | grep возвращают 1, когда активен - выдает инфу кто его использует и возвращает помимо этого 0.

Но как сделать без subprocess (так как все же нужен скрипт на питоне желательно без башевских вставок) и как то же самое провернуть с сокетами - вопрос.

Отредактировано Morkan (Апрель 4, 2012 23:15:10)

Офлайн

#5 Апрель 4, 2012 23:49:01

Morkan
Зарегистрирован: 2012-04-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

если заменить S_ISFIFO на S_ISSOCK то вроде что то выводит, но я не знаю правильно ли это? половину вроде как убить пишет, половину как ок

Офлайн

#6 Апрель 6, 2012 10:38:19

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Обнаружение pipe и сокетов

Мне кажется, что поиск по всей файловой системе - это конкретный оверкилл. Я гляну сорцы lsof, но навскидку он все это берет из /proc и /proc должно хватить для решения всей задачи. Кстати, это еще актуально или вы уже все порешали?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version