Toplu Olarak ogrenci (Sınırlı Erişim) Kullanıcısını Silme Uygulaması

Pardus ETAP yüklü akıllı tahtalarda 30-40 tahtada tek tek işlem yapmak yerine ağ üzerinden yönetmek için Python ve PyQt6 kütüphanesini kullanarak modern, kullanıcı dostu bir arayüz hazırlayabiliriz. Bu uygulama hem ağdaki tahtaları tarayacak hem de seçtiğiniz tahtalarda kullanıcı silme işlemini gerçekleştirecektir.


1. Ön Hazırlıklar

İşleme başlamadan önce aşağıdaki şartların sağlandığından emin olun:

  1. IP Listesi: Tüm tahtaların IP adreslerini içeren bir metin dosyanız olmalı (Örn: tahtalar.txt).

  2. SSH Erişimi: Tahtalarda SSH servisinin açık ve yetkili bir kullanıcıya (genelde etapadmin) erişiminizin olması gerekir.

  3. Yedekleme: ogrenci kullanıcısı silindiğinde masaüstündeki ve belgelerindeki tüm veriler silinecektir. Önemli veri varsa yedekleyiniz.


2. Pardus ETAP yüklü tahtaları 🛠 Gerekli Paketlerin Kurulumu

Uygulamayı çalıştırmadan önce sisteminize gerekli araçları kurmanız gerekir:

Bash:
sudo apt update
sudo apt install python3-pyqt6 nmap sshpass -y


3. Pardus Toplu Yönetim Uygulaması (Python/PyQt6)

Bu kodu etap_yonetici.py adıyla kaydedin ve çalıştırın.

Python:
import sys
import subprocess
import threading
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, 
                             QPushButton, QListWidget, QListWidgetItem, 
                             QLineEdit, QLabel, QProgressBar, QMessageBox)
from PyQt6.QtCore import Qt, pyqtSignal, QObject

class WorkerSignals(QObject):
    finished = pyqtSignal(list)
    progress = pyqtSignal(str)

class EtapYonetici(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Pardus ETAP - Toplu Kullanıcı Silme Aracı')
        self.setGeometry(100, 100, 500, 600)
        
        layout = QVBoxLayout()

        # Ağ Aralığı Girişi
        layout.addWidget(QLabel("Ağ Aralığı (Örn: 192.168.1.0/24):"))
        self.network_input = QLineEdit("192.168.1.0/24")
        layout.addWidget(self.network_input)

        # Admin Bilgileri
        h_layout = QHBoxLayout()
        self.admin_user = QLineEdit("etapadmin")
        self.admin_pass = QLineEdit()
        self.admin_pass.setEchoMode(QLineEdit.EchoMode.Password)
        self.admin_pass.setPlaceholderText("Admin Şifresi")
        h_layout.addWidget(QLabel("Admin:"))
        h_layout.addWidget(self.admin_user)
        h_layout.addWidget(self.admin_pass)
        layout.addLayout(h_layout)

        # Tarama Butonu
        self.scan_btn = QPushButton("Ağı Tara (Tahtaları Bul)")
        self.scan_btn.clicked.connect(self.start_scan)
        layout.addWidget(self.scan_btn)

        # Liste
        layout.addWidget(QLabel("Bulunan Tahtalar (Silmek istediklerinizi seçin):"))
        self.ip_list = QListWidget()
        layout.addWidget(self.ip_list)

        # İlerleme Çubuğu ve Durum
        self.pbar = QProgressBar()
        layout.addWidget(self.pbar)
        self.status_label = QLabel("Hazır")
        layout.addWidget(self.status_label)

        # Aksiyon Butonu
        self.delete_btn = QPushButton("SEÇİLİ TAHTALARDAN 'ogrenci' KULLANICISINI SİL")
        self.delete_btn.setStyleSheet("background-color: #e74c3c; color: white; font-weight: bold;")
        self.delete_btn.clicked.connect(self.start_deletion)
        layout.addWidget(self.delete_btn)

        self.setLayout(layout)

    def log(self, text):
        self.status_label.setText(text)

    # --- TARAMA İŞLEMLERİ ---
    def start_scan(self):
        self.ip_list.clear()
        self.scan_btn.setEnabled(False)
        self.log("Ağ taranıyor, lütfen bekleyin...")
        threading.Thread(target=self.run_scan_thread).start()

    def run_scan_thread(self):
        network = self.network_input.text()
        # Nmap ile port 22 açık cihazları bul
        cmd = f"nmap -p 22 --open {network} | grep 'Nmap scan report for' | awk '{{print $NF}}' | tr -d '()'"
        try:
            output = subprocess.check_output(cmd, shell=True).decode().splitlines()
            self.scan_finished(output)
        except:
            self.scan_finished([])

    def scan_finished(self, ips):
        self.scan_btn.setEnabled(True)
        if not ips:
            self.log("Cihaz bulunamadı!")
            return
        for ip in ips:
            item = QListWidgetItem(ip)
            item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable)
            item.setCheckState(Qt.CheckState.Checked)
            self.ip_list.addItem(item)
        self.log(f"{len(ips)} cihaz bulundu.")

    # --- SİLME İŞLEMLERİ ---
    def start_deletion(self):
        selected_ips = []
        for i in range(self.ip_list.count()):
            item = self.ip_list.item(i)
            if item.checkState() == Qt.CheckState.Checked:
                selected_ips.append(item.text())

        if not selected_ips:
            QMessageBox.warning(self, "Hata", "Lütfen en az bir tahta seçin.")
            return

        if not self.admin_pass.text():
            QMessageBox.warning(self, "Hata", "Lütfen admin şifresini girin.")
            return

        confirm = QMessageBox.question(self, "Onay", f"{len(selected_ips)} tahtadan 'ogrenci' kullanıcısı silinecek. Emin misiniz?",
                                      QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
        
        if confirm == QMessageBox.StandardButton.Yes:
            self.delete_btn.setEnabled(False)
            threading.Thread(target=self.run_delete_thread, args=(selected_ips,)).start()

    def run_delete_thread(self, ips):
        password = self.admin_pass.text()
        user = self.admin_user.text()
        total = len(ips)

        for index, ip in enumerate(ips):
            self.log(f"İşleniyor: {ip} ({index+1}/{total})")
            # SSH üzerinden kullanıcı silme komutu
            del_cmd = f"sshpass -p '{password}' ssh -o StrictHostKeyChecking=no {user}@{ip} 'echo {password} | sudo -S deluser --remove-home ogrenci'"
            subprocess.run(del_cmd, shell=True)
            self.pbar.setValue(int(((index + 1) / total) * 100))

        self.log("İşlem tamamlandı.")
        self.delete_btn.setEnabled(True)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = EtapYonetici()
    ex.show()
    sys.exit(app.exec())

4. Uygulamayı Çalıştırma

Bu uygulama sistem dosyalarına (/etc/hosts) müdahale ettiği için normal bir kullanıcı olarak çalıştırılamaz. Pardus terminalini açın ve kaydettiğiniz dizine giderek şu komutu girin:

Bash
sudo python3 etap_yonetici.py 

Şifrenizi girdikten sonra uygulama açılacaktır.


Uygulama Nasıl Kullanılır?

  1. Ağ Aralığı: Kendi okul ağınızı girin (Genelde varsayılan 192.168.1.0/24 doğrudur).

  2. Admin Bilgileri: Tahtalardaki yetkili kullanıcı adı (etapadmin) ve şifresini yazın.

  3. Taramayı Başlat: "Ağı Tara" butonuna basın. Program, SSH portu açık olan tüm cihazları listeler.

  4. Seçim Yapın: Listeden işlem yapmak istemediğiniz tahtaların tikini kaldırabilirsiniz.

  5. Kullanıcıyı Sil: Kırmızı butona basın. Program sırayla her tahtaya bağlanıp ogrenci kullanıcısını ev diziniyle birlikte silecektir.


Geliştirme Notları

  • Hız: Program threading kullandığı için tarama ve silme sırasında donma yapmaz.

  • Güvenlik: Şifre alanı yıldızlı (Password Echo) şekilde ayarlanmıştır.

  • Hata Ayıklama: Eğer bir tahtada şifre yanlışsa veya bağlantı koparsa, program o tahtayı atlayıp bir sonrakine geçer.

Yorumlar

Bu blogdaki popüler yayınlar

Pardus İçin Python ile "Web Sitesi Engelleyici" (Website Blocker)

Pardus Üzerine PyCharm Kurulumu ve Ayarları

Pardus ETAP , "Duvar Kağıdı Kilitleyici" GUI uygulaması