Rust ve egui ile geliştirilmiş, grafiksel arayüzlü zengin özellikli SSH istemcisi
tar, tar.gz, tar.bz2, zipfind ile özyinelemeli aramadf -h çıktısı, kullanım çubuğu ve renk eşiğiyleps aux tabanlı gerçek zamanlı süreç listesikill ile onaylı sonlandırma/etc/apt/sources.list ve .sources.d/ düzenleme[arch=… signed-by=…] söz dizimi desteğiapt-cache search / brew search)apt list --installed / brew list --versions)apt list --upgradable / brew outdated)claude-opus-4-6 modeli ile doğal dil SSH yardımcısı| Dil | Kod |
|---|---|
| Türkçe | tr (varsayılan) |
| English | en |
| Español | es |
| Português | pt |
| Terminal + Çoklu Sekme | Dosya Yöneticisi |
|---|---|
![]() |
![]() |
| Mimari | Paket |
|---|---|
| x86-64 (Intel/AMD) | ulak_0.2.0-1_amd64.deb |
| ARM 64-bit | ulak_0.2.0-1_arm64.deb |
| RISC-V 64-bit | ulak_0.2.0-1_riscv64.deb |
# Debian/Ubuntu (amd64)
sudo dpkg -i ulak_0.2.0-1_amd64.deb
sudo apt-get install -f # bağımlılıkları çöz
# PKGBUILD ile
makepkg -si
sudo rpm -i ulak-0.2.0-1.x86_64.rpm
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
rustup update stable
# Sistem bağımlılıkları
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config \
libssl-dev \
libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \
libxkbcommon-dev \
libgl-dev \
libfontconfig1-dev libfreetype-dev
# Kaynak kodunu al ve derle
git clone https://git.code.sf.net/p/anadolu-panteri/Ulak
cd ulak
cargo build --release
# Çalıştır
./target/release/ulak
Ubuntu 22.04+ ve Debian 12 (Bookworm) üzerinde test edilmiştir.
# Sistem bağımlılıkları
sudo pacman -Syu --needed \
base-devel pkg-config \
openssl \
libxcb xcb-util \
libxkbcommon \
mesa \
fontconfig freetype2 \
wayland
# Kaynak kodunu al ve derle
git clone https://git.code.sf.net/p/anadolu-panteri/Ulak
cd ulak
cargo build --release
# Çalıştır
./target/release/ulak
PKGBUILD ile paket olarak kurmak için:
bash makepkg -si
# Sistem bağımlılıkları
sudo dnf install -y \
gcc gcc-c++ make pkg-config \
openssl-devel \
libxcb-devel libxkbcommon-devel \
mesa-libGL-devel \
fontconfig-devel freetype-devel \
wayland-devel
# Kaynak kodunu al ve derle
git clone https://git.code.sf.net/p/anadolu-panteri/Ulak
cd ulak
cargo build --release
# Çalıştır
./target/release/ulak
Fedora 38+ ve RHEL/Rocky 9 üzerinde test edilmiştir.
RHEL/Rocky'de
openssl-develyoksa:
bash sudo dnf install -y epel-release && sudo dnf install -y openssl-devel
⚠️ macOS desteği deneyseldir. egui/eframe Metal backend ile çalışır;
OpenGL backend devre dışıdır.
# Xcode Command Line Tools (zorunlu)
xcode-select --install
# Homebrew kurulu değilse
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Bağımlılıklar
brew install openssl pkg-config
# OpenSSL yolunu Cargo'ya bildir
export OPENSSL_DIR=$(brew --prefix openssl)
export PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig"
git clone https://git.code.sf.net/p/anadolu-panteri/Ulak
cd ulak
Apple Silicon — M1 / M2 / M3 (MacBook Air dahil):
rustup target add aarch64-apple-darwin
cargo build --release --target aarch64-apple-darwin
# Çıktı: target/aarch64-apple-darwin/release/ulak
Intel Mac:
rustup target add x86_64-apple-darwin
cargo build --release --target x86_64-apple-darwin
# Çıktı: target/x86_64-apple-darwin/release/ulak
Evrensel İkili (Universal Binary — hem M1 hem Intel):
rustup target add aarch64-apple-darwin x86_64-apple-darwin
cargo build --release --target aarch64-apple-darwin
cargo build --release --target x86_64-apple-darwin
lipo -create -output ulak \
target/aarch64-apple-darwin/release/ulak \
target/x86_64-apple-darwin/release/ulak
# Doğrula
lipo -archs ulak # → x86_64 arm64
DMG oluşturmak macOS üzerinde yapılmalıdır (hdiutil macOS'a özgüdür).
# Projenin kök dizininden çalıştır
bash scripts/package-macos.sh
# Çıktı: ulak-0.2.0-arm64.dmg
Adım 1 — Binary derle (M1):
export OPENSSL_DIR=$(brew --prefix openssl)
export PKG_CONFIG_PATH="$OPENSSL_DIR/lib/pkgconfig"
cargo build --release --target aarch64-apple-darwin
Adım 2 — .app bundle oluştur:
macOS uygulamaları belirli bir dizin yapısı gerektirir:
ulak.app/
└── Contents/
├── Info.plist ← uygulama meta verisi
├── MacOS/
│ └── ulak ← derlenmiş binary
└── Resources/
└── ulak.icns ← uygulama ikonu (opsiyonel)
APP="ulak.app"
mkdir -p "$APP/Contents/MacOS"
mkdir -p "$APP/Contents/Resources"
# Binary kopyala
cp target/aarch64-apple-darwin/release/ulak "$APP/Contents/MacOS/ulak"
chmod +x "$APP/Contents/MacOS/ulak"
# İkon kopyala (varsa)
# cp assets/ulak.icns "$APP/Contents/Resources/ulak.icns"
Adım 3 — Info.plist yaz:
cat > "$APP/Contents/Info.plist" << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>ulak</string>
<key>CFBundleDisplayName</key>
<string>ulak</string>
<key>CFBundleIdentifier</key>
<string>com.example.ulak</string>
<key>CFBundleVersion</key>
<string>0.2.0</string>
<key>CFBundleShortVersionString</key>
<string>0.2.0</string>
<key>CFBundleExecutable</key>
<string>ulak</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>ulak</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>LSMinimumSystemVersion</key>
<string>12.0</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2026 Ortanca Samuray. GPL-3.0-or-later.</string>
</dict>
</plist>
EOF
Adım 4 — DMG oluştur:
# Basit yöntem (hdiutil)
hdiutil create \
-volname "ulak 0.2.0" \
-srcfolder ulak.app \
-ov \
-format UDZO \
ulak-0.2.0-arm64.dmg
echo "✓ ulak-0.2.0-arm64.dmg oluşturuldu"
create-dmg ile daha şık DMG (opsiyonel):
```bash
brew install create-dmgcreate-dmg \
--volname "ulak 0.2.0" \
--window-pos 200 120 \
--window-size 600 400 \
--icon-size 128 \
--icon "ulak.app" 150 185 \
--hide-extension "ulak.app" \
--app-drop-link 450 185 \
ulak-0.2.0-arm64.dmg \
ulak.app
```
Adım 5 — (Opsiyonel) İmzalama ve Notarizasyon:
Apple Developer hesabı olmadan uygulama macOS Gatekeeper tarafından engellenir.
İmzasız DMG'yi açmak için:
Finder → DMG'ye çift tık → ulak.app üzerine sağ tık → Aç → Aç
Apple Developer hesabı varsa (dağıtım için):
# Ad hoc imzalama (kişisel kullanım)
codesign --force --deep --sign - ulak.app
# Apple ID ile dağıtım imzalama
codesign --force --deep \
--sign "Developer ID Application: Ad Soyad (TEAMID)" \
--options runtime \
ulak.app
# Notarizasyon
xcrun notarytool submit ulak-0.2.0-arm64.dmg \
--apple-id "your@email.com" \
--team-id "TEAMID" \
--password "@keychain:AC_PASSWORD" \
--wait
xcrun stapler staple ulak-0.2.0-arm64.dmg
| Dosya | Açıklama |
|---|---|
ulak.app |
macOS uygulama paketi |
ulak-0.2.0-arm64.dmg |
M1/M2/M3 için kurulum imajı |
Desteklenen hedefler:
# ARM64 (aarch64)
rustup target add aarch64-unknown-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu # Debian/Ubuntu
cargo build --release --target aarch64-unknown-linux-gnu
# RISC-V 64
rustup target add riscv64gc-unknown-linux-gnu
sudo apt-get install gcc-riscv64-linux-gnu # Debian/Ubuntu
cargo build --release --target riscv64gc-unknown-linux-gnu
Not: Çapraz derleme için hedef mimariye ait OpenSSL sysroot gereklidir.
Bkz..cargo/config.tomllinker ayarları.
| Platform | Binary Derleme | Paket Oluşturma |
|---|---|---|
| Debian/Ubuntu | cargo build --release |
dpkg-buildpackage -b |
| Arch/Manjaro | cargo build --release |
makepkg -si |
| Fedora/RHEL | cargo build --release |
rpmbuild -bb ulak.spec |
| macOS M1/M2/M3 | cargo build --release --target aarch64-apple-darwin |
bash scripts/package-macos.sh |
| macOS Intel | cargo build --release --target x86_64-apple-darwin |
bash scripts/package-macos.sh --intel |
| macOS Evrensel | lipo ile birleştir |
bash scripts/package-macos.sh --universal |
| Linux → ARM64 | cargo build --release --target aarch64-unknown-linux-gnu |
scripts/package-arm64.sh |
| Linux → RISC-V | cargo build --release --target riscv64gc-unknown-linux-gnu |
— |
ulak komutu veya uygulama simgesiyle başlatınBağlantı kurulunca üst çubukta sekmeler aktif hale gelir:
| Sekme | Açıklama |
|---|---|
>_ |
Terminal (çoklu sekme) |
📁 |
Dosya Yöneticisi (SFTP) |
🔍 |
Dosya Arama |
💾 |
Disk Analizi |
⚙ |
Süreç Yöneticisi |
🔧 |
Servis Yöneticisi |
📦 |
Paket Yöneticisi |
📋 |
APT Depo Yöneticisi |
📊 |
Kaynak İzleme |
🤖 |
AI Agent |
⚙️ |
Ayarlar |
| Tuş | Eylem | Açıklama |
|---|---|---|
| F4 | Yeniden Adlandır | Seçili öğeyi satır içi düzenle |
| F5 | Kopyala | Aktif panelden karşı panele kopyala |
| F6 | Taşı | Aktif panelden karşı panele taşı (kaynak silinir) |
| F7 | Yeni Dizin | Aktif panelde yeni dizin oluştur |
| F9 | Sil | Seçili öğeyi onay ile sil |
F5 / F6 çapraz panel davranışı:
Uzak panelde seçiliyse → yerel dizine kopyala/taşı
Yerel panelde seçiliyse → uzak dizine kopyala/taşı
| Buton | Eylem |
|---|---|
◀ |
Önceki dizine dön (geçmiş) |
▲ |
Üst dizine çık |
🏠 |
Ana dizine git |
⟳ |
Dizini yenile |
📁+ |
Yeni dizin oluştur (uzak) |
Dosya/dizin üzerinde sağ tık ile:
tar.gz, tar.bz2, zip)| Kısayol | Eylem |
|---|---|
| Ctrl+F | Arama çubuğunu aç / kapat |
| Ctrl+H | Değiştir satırını aç / kapat |
| Enter / ▶ | Sonraki eşleşmeye git |
| ◀ | Önceki eşleşmeye git |
| Ctrl+S | Kaydet |
| Esc | Arama çubuğunu kapat |
🤖 sekmesinde Claude API entegrasyonu ile SSH sunucusunda doğal dil komutları çalıştırabilirsiniz.
sk-ant-… anahtarınızı girin🤖 AI Agent sekmesine geçin"df -h çıktısını analiz et ve disk doluluk durumunu özetle"
"Hangi servisler aktif çalışıyor?"
"Son 100 satır sistem logunu incele ve hata varsa bildir"
"En çok CPU kullanan 5 süreci listele"
Agent gerekli SSH komutlarını otomatik olarak çalıştırır, çıktıları okur ve sonucu doğal dilde açıklar.
Ayarlar ~/.config/ulak/settings.json dosyasında saklanır.
| Ayar | Varsayılan | Açıklama |
|---|---|---|
language |
Turkish |
Arayüz dili |
use_dark_theme |
true |
Koyu tema |
show_hidden_files |
false |
Gizli dosyaları göster |
confirm_before_delete |
true |
Silmeden önce onayla |
dual_pane_mode |
true |
Çift bölme modu |
terminal_font_size |
14 |
Terminal yazı boyutu (px) |
terminal_theme |
"dark" |
Terminal renk teması |
connection_timeout |
30 |
Bağlantı zaman aşımı (sn) |
ssh_keepalive_interval |
60 |
Keepalive aralığı (sn) |
default_remote_folder |
"/" |
Varsayılan uzak dizin |
show_transfer_progress |
true |
Transfer ilerlemesini göster |
auto_save_sessions |
true |
Oturumları otomatik kaydet |
claude_api_key |
"" |
Claude API anahtarı |
ulak/
├── src/
│ ├── main.rs — Giriş noktası, eframe başlatma
│ ├── app.rs — Uygulama durum makinesi (Giriş → Ana)
│ ├── config/
│ │ ├── auth.rs — Ana parola & PBKDF2 anahtar türetme
│ │ ├── crypto.rs — AES-256-GCM şifreleme/şifre çözme
│ │ ├── session.rs — SSH oturum tanımları
│ │ ├── settings.rs — Kullanıcı ayarları
│ │ └── store.rs — JSON kalıcı depolama
│ ├── ssh/
│ │ ├── client.rs — SSH worker thread (tek iş parçacığı, senkron)
│ │ ├── sftp.rs — Dosya işlemleri (yükle/indir/listele/sil)
│ │ ├── auth.rs — SSH kimlik doğrulama yöntemleri
│ │ └── channel.rs — SSH kanal yönetimi
│ ├── terminal/
│ │ ├── mod.rs
│ │ └── emulator.rs — vt100 sarmalayıcı
│ ├── ui/
│ │ ├── main_window.rs — Ana pencere, sekme yönetimi
│ │ ├── file_browser.rs— Çift bölmeli SFTP dosya yöneticisi
│ │ ├── terminal.rs — Terminal UI bileşeni
│ │ ├── process_viewer.rs
│ │ ├── disk_analyzer.rs
│ │ ├── port_forwarding.rs
│ │ ├── settings.rs
│ │ ├── session_list.rs
│ │ ├── session_manager.rs
│ │ ├── session_edit.rs
│ │ └── ai_panel.rs — AI agent paneli
│ ├── ai/
│ │ └── agent.rs — Claude API tool-use döngüsü
│ ├── i18n/ — Çoklu dil desteği
│ └── util/ — Yardımcı fonksiyonlar
├── assets/
│ └── ulak.svg — Uygulama simgesi
├── debian/ — Debian paket metadata
├── scripts/ — Paketleme betikleri
├── Cargo.toml
└── LICENSE — GPL-3.0-or-later
| Karar | Gerekçe |
|---|---|
| Tek SSH worker thread | libssh2 iş parçacığı güvenli değil; tüm SSH G/Ç serileştirildi |
mpsc kanal mimarisi |
Worker → UI event kanalı; bloke etmeden UI güncellemesi |
| Engellemesiz kabuk G/Ç | Terminal sekmeleri için non-blocking SSH kanalları |
| Ayrı bağlantılar | find, apt-get install gibi uzun süreli komutlar için ayrı SSH bağlantısı |
| 64 KB transfer parçaları | Transfer ilerleme raporlama granülaritesi |
eframe = "0.29" # GUI çerçevesi (OpenGL backend)
egui = "0.29" # Immediate mode GUI
ssh2 = "0.9" # SSH protokolü (libssh2 sarmalayıcı)
tokio = "1" # Async çalışma zamanı
serde = "1" # Serileştirme
vt100 = "0.15" # Terminal emülasyonu
rfd = "0.14" # Dosya diyalogları
aes-gcm = "0.10" # Şifreleme
reqwest = "0.12" # HTTP (Claude API)
arboard = "3" # Pano
uuid = "1"
chrono = "0.4"
anyhow = "1"
tracing = "0.1"
Bu proje GNU Genel Kamu Lisansı v3 veya sonrası (GPL-3.0-or-later) koşullarıyla lisanslanmıştır.
Lisans metninin tamamı için bkz. LICENSE.
Copyright (C) 2026 Ortanca Samuray
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.