İçeriğe geç
ivralo
Bölümler

Dokümantasyon / Geliştirici modu

Shell komutları

Bir ajanın run_shell ile çalıştırdığı her komut, çalışmadan önce izin ver, sor ya da reddet olarak sınıflandırılır. Bu kararın nasıl verildiği, reddedilen komutların tam listesi, kararı ayarlayan iki izin dosyası ve bir komutta geçen host'ların nasıl değerlendirildiği bu sayfada.

run_shell

run_shell çalışma alanında tek bir komut çalıştırır. Bu araç shell.full yetkisine sahip ajanlarda bulunur: ana ajan, Code Engineer, dönüştürücüler (Report Writer, Document and Deck Writer, PDF Operator) ve GitHub Clerk. strict profili bu aracı kaldırır.

Komutlar varsayılan olarak 120 saniyelik bir timeout ile çalışır. Bu süreyi bir izin dosyasındaki timeout ile değiştirebilirsiniz, ama hiçbir şeyin aşamayacağı 600 saniyelik bir üst sınır vardır. Süreyi aşan ya da çağrısını Esc ile iptal ettiğiniz bir komut, başlattığı her şeyle birlikte sonlandırılır. Uzun çıktıların tamamı .ivralo/spill/ altına yazılır. Ajana çıktının başı, sonu ve geri kalanının nerede olduğu verilir.

Komut yalnızca izin listesindeki ortam değişkenlerini görür: PATH, temp ve home yolları, locale, kullanıcı adı, TZ ve Windows'un temel değişkenleri. GH_TOKEN ve GITHUB_TOKEN dahil hiçbir anahtar, token ya da parola komuta ulaşmaz. gh sizin kendi gh auth login oturumunuzla kimlik doğrular. GIT_TERMINAL_PROMPT=0 ve GIT_EDITOR=true gibi sabit ayarlar sayesinde editör ya da prompt açacak bir komut turu askıda bırakmak yerine hemen hata verir.

Üç karar

Komut operatörlerinden (&&, ||, |, ;, &) parçalara ayrılır, her parça ayrı sınıflandırılır ve komutun tamamı en riskli parçası kadar riskli sayılır. Karar iki kez uygulanır: aracın kendisinde ve oturumda, size sorulmadan önce.

KararNeÖrnekler
allowPolitikanın baştan sona okuyabildiği salt okuma komutları, git ve gh'nin salt okuma alt komutları ve allow listenizin kapsadığı her şeyls, cat, head, grep, wc, which, git status, git log, git diff, gh pr list
askGeri kalan her şey. Oturumda diyalog açar; başında kimse olmayan bir çalıştırmada reddediliruv run pytest, npm install, git commit, gh pr review
denyAşağıdaki temel liste ve deny listenizin kapsadığı her şey. Gerekçesiyle reddedilir ve bunu hiçbir şey kaldıramaz: ne /confirm, ne a, ne de bir allow kaydırm -rf build, curl https://..., git push

Bir komut ancak politika içindeki her şeyi görebiliyorsa salt okuma olarak kalır. Tek tırnak dışında bir $(...), bir backtick ya da bir $NAME varsa komut onay ister, çünkü shell bunları program başlamadan önce doldurur. Paket kurmak salt okuma değildir, bu yüzden projedeki diğer değişiklikler gibi onay ister. ivralo'nun kendisini çağırması (uv run ivralo ask) her zaman onay ister.

git ve gh komutları iki kez okunur: bir kez yazıldığı gibi, bir kez de global seçenekleri, .exe uzantısı ve tırnakları çıkarılarak. Böylece git -C sub push --force ile "git" push --force aynı push sayılır. -c, --config-env ya da --exec-path içeren veya program çalıştıran ya da dosya yazan bir seçenek (--ext-diff, --output=) taşıyan bir git okuma komutu onay ister.

Reddedilen komutların temel listesi

SınıfReddedilenler
Özyinelemeli silmerm -r / rm --recursive, rmdir /s, rd /s, /s ya da /q ile del, Remove-Item -Recurse ya da -Force, joker karakterle silme
Disk ya da sistem değişikliğiformat, diskpart, bcdedit, shutdown, schtasks, sc, reg add/delete/import, net user, net localgroup, git config --global ya da --system (okumalar dahil)
Kodlanmış komutpowershell -e / -enc / -encodedcommand, certutil -decode, base64 -d
İç içe shellsh, bash, zsh, cmd, powershell, pwsh
Ağcurl, wget, ssh, scp, sftp, ftp, telnet, nc, ncat, Invoke-WebRequest, Invoke-RestMethod, iwr, irm
Sistem paket yöneticisiapt, apt-get, dnf, yum, brew, choco, winget, scoop
Push ya da mergebütün git push, git send-pack, git subtree push, gh pr merge, gh pr ready, gh pr review --approve, gh repo edit --enable-auto-merge komutları, merge ya da ready içeren bütün gh api çağrıları, body içeren bütün gh api graphql çağrıları
Geçmişi yeniden yazmagit reset --hard, git clean, git commit --amend, git rebase -i, git filter-branch, git filter-repo, git reflog expire, git gc --prune, git update-ref -d
Secret'larenv, printenv, bir anahtar, token, secret ya da parola için set, git credential, bir credential için git config, gh auth token, gh auth logout, gh auth status --show-token, bir token için gh config get, gh ssh-key, gh gpg-key
Gizli komutgh alias set, gh alias import, git config alias.*
Tarayıcıgh browse, gh auth login, gh auth refresh
Geri alınamazgh repo/issue/release/run/gist/project delete, gh release delete-asset, gh cache delete --all, gh api -X DELETE, bir deleteRepository mutation'ı
Kapalı yollarBir .env ya da .env.* dosyasını, .ivralo/'yu, .git/'i ya da ivralo'nun kendi config dosyalarını gösteren her kelime; hangi şekilde yazılırsa yazılsın, glob ya da yönlendirme dahil
Erişim dışıÇalışma alanının dışına çıkan bir yol ve dışarıya yazan bir yönlendirme

Temel liste, yazılana değil programa gerçekte verilene bakar. Bu yüzden başa konan bir yönlendirme (>x curl https://x) ya da kelimenin içindeki tırnaklar (c"url") hiçbir şeyi gizleyemez. Windows'ta şapka işareti ya da tek tırnak içeren bir komut hem yazıldığı gibi hem de cmd.exe'nin çalıştıracağı şekliyle değerlendirilir ve daha katı olan karar geçerli olur.

İki izin dosyası

DosyaNerede geçerli
ivralo'nun home dizinindeki permissions.json (yerini IVRALO_PERMISSIONS ile değiştirebilirsiniz)Bütün çalışma alanlarında
Repo'daki .ivralo/permissions.jsonYalnızca o repo'da; git'in dışındadır, makinenizde kalır
{
  "version": 1,
  "allow": ["uv run pytest", "libreoffice --headless"],
  "deny": ["python -c"],
  "timeout": 300,
  "allow_tools": ["edit_file"],
  "hosts": { "allow": ["pypi.internal.example.com"], "deny": ["tracker.example.net"] }
}
AnahtarAnlamı
versionDosya formatı, 1
allowOnay istemeden çalışan komut önekleri
denyReddedilen komut önekleri
timeoutBir komutun çalışabileceği saniye, en fazla 600
allow_toolsBaşında kimse olmayan bir çalıştırmanın kullanabileceği dosya ve git araçları (Düzenleme ve onaylar)
hostsHost adları ya da adresleri için allow ve deny listeleri; bir ad alt alan adlarını da kapsar

İki dosya birleştirilir: allow, deny, allow_tools ve her hosts listesi iki dosyanın birleşimidir. Yani iki dosyadan birinde reddedilen komut reddedilir ve temel liste, iki dosyadan birindeki izne her zaman baskın gelir. timeout için repo bir değer tanımladıysa o, tanımlamadıysa home dizinindeki değer kullanılır. ivralo doctor her dosyanın neye katkı yaptığını gösterir ve her sorunun başına ilgili dosyanın adını yazar. İki dosya da her duraklamada yeniden okunur. Yani elle yaptığınız bir değişiklik, onay isteyecek bir sonraki çağrıdan itibaren geçerli olur.

Güvenmediğiniz bir klasörde repo'nun dosyası yalnızca izinleri kısıtlayabilir: deny ve hosts.deny geçerlidir, allow, allow_tools, hosts.allow ve timeout geçerli değildir.

p: bu komuta her zaman izin ver

Diyalog tek bir shell komutu için onay istediğinde, kaydedeceği önekle birlikte p seçeneğini sunar. Örneğin uv run pytest -q tests/x.py için [p] always "uv run pytest …" in this repository. Önek, komutun ilk seçeneğe, yola, tırnaklı argümana, yönlendirmeye ya da pipe'a kadar olan baş kısmıdır ve en fazla üç kelimedir. p komutu çalıştırır ve öneki home dizinindekine değil, her zaman repo'nun .ivralo/permissions.json dosyasına ekler. O önekle başlayan bir sonraki komut, yeniden başlatma gerekmeden bir allowed satırıyla çalışır.

Hiçbir önek doğru çalışamayacaksa p sunulmaz. Bu durumlar şunlardır: önek, daha uzun bir komuttan kesilmiş tek bir kelime olacaksa (python script.py her python komutuna izin verirdi), program çalıştıran bir seçenek içeren bir git komutu, bir şeyi değiştiren bir gh api çağrısı, bir pipeline ya da bir && zinciri ya da önek kaydedilse bile çalışmasına izin verilmeyecek bir komut. Sunulan önek istediğinizden genişse komutu bir kez çalıştırmak için Enter'a basın. Güvenmediğiniz bir klasörde p sunulmaz.

/permissions              iki dosyanın neye izin verip neyi reddettiği
/permissions remove 2     2. girdiyi bu repo'nun dosyasından çıkar

Host'lar ve egress

Komutta bir URL içinde ya da user@host:path şeklinde geçen bir host, web araçlarını ve Python worker'ını yöneten aynı egress politikasına göre değerlendirilir. Shell, host'ları DNS sorgusu yapmadan, metinde nasıl yazılıysa öyle okur.

HostKarar
Link-local ya da cloud metadata adresiReddedilir
hosts.deny içindeReddedilir
hosts.allow içindeİzin verilir
Loopback, özel bir adres, yerel bir ad ya da listede olmayan herhangi bir hostKomut bir allow kaydıyla eşleşse bile onay ister

Bir allow kaydı komutu onaylar, komutun nereye eriştiğini onaylamaz. Komutun onay istemesinin tek nedeni bir host ise p önek yerine host'u hosts.allow'a kaydeder: [p] always reach pypi.internal.example.com from this repository. Hiçbir host içermeyen bir gh komutu host açısından değerlendirilmez, çünkü gh yalnızca giriş yapılmış host'lara erişir.