Mikail.Net

Yazılımcı günlüğü

local ip scanner

Bu betik, belirtilen IP adresleri veya alan adları listesi için ağ izlemesi gerçekleştirir. Periyodik olarak listedeki her bilgisayarı pingler, ana bilgisayar adını, MAC adresini ve üretici bilgilerini alır ve “public” adlı paylaşılan bir klasörün olup olmadığını kontrol eder. Betik, Windows ve Linux işletim sistemlerinde çalışacak şekilde tasarlanmıştır. İşte betiğin kısa bir açıklaması:

  1. Gerekli kütüphaneleri içe aktarın.
  2. İzlenecek IP adreslerinin listesini tanımlayın.
  3. İşletim sistemini kontrol ederek ping komutunu buna göre uyarlayın.
  4. Verilen bilgisayarın çevrimiçi olup olmadığını kontrol eden ve bunu döndüren check_computer_status(computer) adlı bir fonksiyon tanımlayın.
  5. Verilen IP adresi için ana bilgisayar adını döndüren get_hostname(ip_address) adlı bir fonksiyon tanımlayın.
  6. Verilen IP adresi için MAC adresini ve üretici bilgisini alan get_mac_and_vendor(ip_address) adlı bir fonksiyon tanımlayın. Bu fonksiyonun yalnızca Linux’ta çalıştığını unutmayın.
  7. Verilen IP adresinde “public” adında paylaşılan bir klasörün olup olmadığını kontrol eden check_shared_folders(ip_address) adlı bir fonksiyon tanımlayın.
  8. Bilgisayarların listesi üzerinde dönen, durumlarını kontrol eden ve gerekli bilgileri alan main() adlı bir fonksiyon tanımlayın. Fonksiyon, bir sonraki yinelemeye başlamadan önce 600 saniye (10 dakika) bekler.
  9. main() fonksiyonunu çağırın.

Betikten yararlanmak için, sadece bir Python yorumlayıcısıyla çalıştırabilir ve belirtilen listedeki bilgisayarları izlemeye başlayacaktır. Sisteminizde gerekli kütüphanelerin yüklü olduğundan emin olun.

import os
import subprocess
import platform
import time
import socket
import re
import requests

# Kontrol edilecek bilgisayarların IP adresleri veya etki alanı adları listesi
computers_list = [f"192.168.1.{i}" for i in range(1, 255)]

# İşletim sistemini kontrol etme
os_name = platform.system()


# Ping komutunu çalıştıran ve sonucu döndüren bir fonksiyon
def check_computer_status(computer):
    if os_name == "Windows":
        command = f"ping -n 1 -w 1 {computer}"
    elif os_name == "Linux":
        command = f"ping -c 1 -W 1 {computer}"
    else:
        print("Desteklenmeyen işletim sistemi!")
        return False

    result = subprocess.call(command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True)
    return result == 0


# IP adresini etki alanı adına çeviren fonksiyon
def get_hostname(ip_address):
    try:
        hostname, _, _ = socket.gethostbyaddr(ip_address)
        return hostname
    except socket.herror:
        return None


# IP adresinden MAC adresini ve üretici bilgisini alan fonksiyon
def get_mac_and_vendor(ip_address):
    if os_name == "Linux":
        ip_neigh_command = f"ip neigh show {ip_address}"
    else:
        return None, None

    ip_neigh_output = subprocess.check_output(ip_neigh_command, shell=True).decode()
    mac_address = re.search(r"(([0-9a-fA-F]{2}[:-]){5}([0-9a-fA-F]{2}))", ip_neigh_output)
    if mac_address:
        mac_address = mac_address.group(0)
        vendor_url = f"https://api.macvendors.com/{mac_address}"
        try:
            vendor = requests.get(vendor_url).text
        except requests.exceptions.RequestException:
            vendor = "Bilinmiyor"
    else:
        mac_address = "Bilinmiyor"
        vendor = "Bilinmiyor"

    return mac_address, vendor

# Herkez ile paylasilmis public klasorunun varliginin kontrolu
def check_shared_folders(ip_address):
    for root, dirs, files in os.walk(f"\\\\{ip_address}\\"):
        for name in dirs:
            if name.lower() == 'public':
                print(f"'{root}{name}' is a shared folder")
            else:
                print(f"'{root}{name}' is not a shared folder")

# Ana fonksiyon
def main():
    while True:
        for computer in computers_list:
            status = check_computer_status(computer)
            if status:
                hostname = get_hostname(computer)
                mac_address, vendor = get_mac_and_vendor(computer)
                check_shared_folders(computer)
                if hostname:
                    print(f"{computer} ({hostname}) is ONLINE. MAC: {mac_address}, Vendor: {vendor}")
                else:
                    print(f"{computer} is ONLINE. MAC: {mac_address}, Vendor: {vendor}")

        time.sleep(600)  # 600 saniye bekle (10 dakika)


if __name__ == "__main__":
    main()