Akıllı Altyapı Butonu: Otomatik SSH & Server Tetikleyici

Gömülü Sistemler SSH Otomasyonu Linux Devops SysAdmin

1. Projenin Amacı ve Operasyonel Vizyonu

Ağ altyapılarında veya yerel ağ (LAN) üzerinde barındırılan sanal Linux oyun sunucularını yönetmek, sunucu çökmelerinde veya yeniden başlatma durumlarında sistem yöneticileri için zaman kaybına yol açmaktadır. Geleneksel yöntemde yöneticinin terminali açması, SSH komut zincirini yazması, şifre/anahtar doğrulaması yapması ve ardından servis başlatma scriptlerini el ile çalıştırması gerekir.

Bu projenin amacı, tüm bu karmaşık komut satırı süreçlerini donanımsal bir makro tetikleyiciye yükleyerek tek bir fiziksel butonla otomatize etmektir.

2. Komut Enjeksiyonu ve Güvenlik Protokolü

Cihaz üzerindeki butona basıldığı anda mikrodenetleyici bilgisayara şu sıralı USB klavye paketlerini gönderir:

İlk olarak Windows işletim sisteminin "Çalıştır" (Win + R) diyalog kutusu tetiklenir. Arayüze gecikmesiz olarak cmd.exe komutu yazılıp entera basılarak Windows Komut Satırı konsolu çağrılır. Konsolun ekrana gelme süresi hesaplanarak donanıma 500ms bekleme emri verilir. Ardından konsola yerel ağdaki sunucuya bağlanacak olan şifreli ağ protokolü komutu yazılır.

3. Otomasyon Firmware Kaynak Kodları

Arduino donanımı içerisine yüklenen, işletim sistemi arayüz yönetimini ve klavye sinyal enjeksiyonunu yöneten kaynak kod mimarisi aşağıda sunulmuştur:

#include <Keyboard.h>

const int actionButton = 3; 
int lastState = HIGH;

void setup() {
  pinMode(actionButton, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  int currentState = digitalRead(actionButton);

  if (currentState == LOW && lastState == HIGH) {
    
    Keyboard.press(KEY_LEFT_GUI);
    Keyboard.press('r');
    delay(100);
    Keyboard.releaseAll();
    delay(400); 

    Keyboard.print("cmd");
    Keyboard.press(KEY_RETURN);
    delay(100);
    Keyboard.releaseAll();
    delay(600); 

    Keyboard.print("ssh berkay@192.168.1.100 \"screen -d -m ./start_game_server.sh\"");
    delay(100);
    Keyboard.press(KEY_RETURN);
    delay(100);
    Keyboard.releaseAll();

    delay(300); 
  }
  lastState = currentState;
}