Dvoupanelový SFTP/FTP klient pro macOS — náhrada WinSCP. Samostatná desktopová aplikace (Electron), ne webová stránka: vlastní okno, vlastní ikona v Docku, plný přístup k souborům na disku.
Dva panely jsou dva břehy a Charon je ten, kdo mezi nimi převáží. Na rozdíl od předlohy vozí i zpátky.
| Funkce z WinSCP | Stav |
|---|---|
| Dva panely vedle sebe, přetahování mezi nimi i z Finderu | ✅ |
| Úprava vzdáleného souboru v editoru s automatickým nahráním při uložení | ✅ |
| Synchronizace adresářů s náhledem, co se provede | ✅ |
| SFTP (heslo, klíč, ssh-agent) i FTP / FTPS | ✅ |
| Fronta přenosů — průběh, pauza, navázání na přerušený přenos | ✅ |
| Ve frontě je nahoře to, co se právě přenáší; hotové se dají uklízet průběžně | ✅ |
| Uložené relace včetně hesel, ve složkách | ✅ |
| Import relací z WinSCP i s hesly | ✅ |
| Zachování času změny souboru při přenosu | ✅ |
| Ověřování identity serveru (host key i TLS certifikát) | ✅ |
| Dotaz při přepisu existujícího souboru | ✅ |
| Koš na serveru místo nevratného mazání | ✅ |
| Práva souborů (chmod), přejmenování, mazání, nové složky | ✅ |
| Přesun mezi panely (F6), ne jen kopírování | ✅ |
| Řazení kliknutím na hlavičku sloupce | ✅ |
| Historie cest (zpět/vpřed) a záložky | ✅ |
| Filtr a výběr podle masky souborů | ✅ |
| Hledání souborů na serveru | ✅ |
| Dopočítání velikosti složek | ✅ |
| Sloupce vlastníka a skupiny, nastavitelný dvojklik | ✅ |
| Sloupec typu a šířka sloupců tažením | ✅ |
| Masky souborů pro přenosy i synchronizaci | ✅ |
| Souběžné přenosy a omezení rychlosti | ✅ |
| Přenos přes dočasný název | ✅ |
| Hlídání složky s automatickým nahráváním | ✅ |
| Víc připojení naráz v záložkách | ✅ |
| Vlastní příkazy a konzole na serveru | ✅ |
| Vlastnosti souboru, rekurzivní práva a kontrolní součet | ✅ |
| Detekce cizí změny při ukládání z editoru | ✅ |
| Nedokončená fronta přežije zavření aplikace | ✅ |
| Automatické obnovení spadlého spojení | ✅ |
| SSH brána (jump host) a proxy SOCKS5 / HTTP | ✅ |
| Pracovní plochy — uložená sada otevřených záložek | ✅ |
| Světlý, tmavý a systémový motiv | ✅ |
| Ikony souborů a složek podle typu | ✅ |
| Odhad zbývajícího času a celková velikost | ✅ |
| Práva nahraných souborů | ✅ |
| Uložené nastavení synchronizace u relace | ✅ |
Import z ~/.ssh/config včetně bran |
✅ |
| Barva a poznámka u relace | ✅ |
| Vyrovnávací paměť výpisů | ✅ |
| Správce relací se stromem složek a hledáním | ✅ |
| Režimy synchronizace a řešení konfliktů | ✅ |
| Řazení a řízení položek ve frontě | ✅ |
| Kódování názvů a časový posun u starších FTP | ✅ |
| Hromadné přejmenování s náhledem | ✅ |
| Otevření Terminálu v aktuální cestě | ✅ |
| Akce po vyprázdnění fronty | ✅ |
| Přenos jen nových a změněných souborů | ✅ |
| Kopie, symlink a ruční čas na serveru | ✅ |
| Editor podle přípony | ✅ |
| Záloha přepsaných souborů | ✅ |
| Nastavitelné keepalive a timeouty | ✅ |
| Textový režim a konverze konců řádků | ✅ |
| Porovnání složek přímo v panelech | ✅ |
| Otevření z adresy a kopírování adresy | ✅ |
| Otevření v přiřazené aplikaci | ✅ |
| Synchronizované procházení | ✅ |
| Profily nastavení přenosu | ✅ |
| Záznam komunikace do souboru | ✅ |
| Víc spojení na jeden velký soubor | ✅ |
| Vlastní písmo, velikost a přiblížení | ✅ |
| Nastavení rozdělené na oddíly | ✅ |
| Kontrola aktualizací | ✅ |
Nepodporuje SCP, WebDAV ani S3 — relace v těchto protokolech se při importu zobrazí, ale nejdou naimportovat.
npm install
npm startOkno naskočí za pár vteřin. Takhle se aplikace spouští při vývoji — zavřením
terminálu skončí. npm run dev je totéž; nástroje pro vývojáře se otevřou až
npm run devtools, aby při běžném spuštění ze zdrojáků nepřekážely.
npm run distVznikne dist/mac-arm64/Charon.app (na dvojklik) a dist/Charon-1.1.0-arm64.dmg
pro přenos jinam. Do Aplikací se přetáhne z DMG, nebo příkazem:
cp -R dist/mac-arm64/Charon.app /Applications/Aplikace je podepsaná jen sama sebou (ad-hoc); notarizovat ji bez vývojářského certifikátu za 99 dolarů ročně nejde. Sestavená lokálně se otevře bez řečí, protože si nenese karanténu. Stažené DMG — i vlastní, z GitHubu — ji ale dostane a systém první spuštění zastaví hláškou, že se Applu nepodařilo ověřit, jestli aplikace neobsahuje malware. Odklepne se to v Nastavení systému → Soukromí a zabezpečení → Přesto otevřít, nebo natvrdo:
xattr -dr com.apple.quarantine /Applications/Charon.appSchválení platí trvale; přetažení do Aplikací Gatekeeper neřeší vůbec, blokuje se jen spuštění.
Podpis dělá build/adhoc-sign.js po sestavení balíčku. Bez něj zůstane
podepsaná jen hlavní binárka od linkeru, _CodeSignature celého balíčku chybí
a stažená aplikace se ohlásí jako poškozená — což vypadá na rozbitý soubor,
ale je to jen neplatný podpis, který se nedá odklepnout.
Data (relace, nastavení) jsou společná pro oba způsoby spuštění, takže se o nic nepřijde přepnutím mezi nimi.
Aplikace se sama neaktualizuje a ani nic nesestavuje při spuštění.
npm startpouští zdrojové soubory přímo, takže stačí okno zavřít a spustit znovu — žádný build..appv Aplikacích je snímek z chvíle sestavení. Po změnách ji vyměníte:
npm run install-appTenhle příkaz sestaví novou verzi a nahradí tu v /Applications. Aplikace
přitom nesmí běžet.
Automatické aktualizace by potřebovaly někde vystavené vydání (typicky GitHub
Releases) a electron-updater. Dokud je Charon jen pro tebe, je install-app
jednodušší.
⌘K nebo tlačítko vlevo v liště. Strom složek, hledání podle názvu, serveru,
uživatele i poznámky, detail vybrané relace vpravo. Připojíte dvojklikem nebo
Enterem, šipkami se dá procházet rovnou z pole hledání. Sbalené složky si
aplikace pamatuje.
Rozbalovací seznam, který tu byl původně, stačil na pět relací; u sedmdesáti ve dvaceti složkách se v něm nedalo nic najít.
Připojení, zakládání, úprava i mazání relací se odbývá tady, takže v liště zůstalo jediné tlačítko, které správce otevře — na jeho popisku je vidět, která relace je vybraná. Samostatná tlačítka Připojit, + Relace, Upravit a Smazat zmizela; dělala podruhé to, co dialog.
Duplikovat vytvoří kopii včetně hesla — kopie se skládá v hlavním procesu, protože do okna se hesla posílají jen na vyžádání okem u pole.
Lišty jsou dvě úrovně. Nahoře je jen to, co platí pro obě strany naráz: relace, obnovit, porovnat, souběžné procházení, synchronizace, hlídání složky, příkazy na serveru a nastavení.
Každý panel má vlastní lištu pod cestou, protože akce nad soubory se týkají konkrétní strany:
| Levý (lokální) | Pravý (server) | |
|---|---|---|
| Analogické | → kopírovat, → přesunout, přenést s volbami | ← kopírovat, ← přesunout, přenést s volbami |
| Společné | nová složka, nový soubor, přejmenovat, smazat, Terminál zde | totéž |
| Vlastní | ukázat ve Finderu | editor, vlastnosti a práva, hledání |
Směr přenosu je dán panelem, ne tím, který je zrovna vpředu — šipka v levé liště míří doprava, v pravé doleva. Kopie nese plus jako táhnutí s ⌥ v systému: na druhé straně něco přibude. Přesun je holá šipka, nic nepřibývá.
Co zrovna nejde, je zašedlé, a každý panel se řídí svým vlastním výběrem: bez spojení zůstane přístupná jen lokální strana, bez výběru jen zakládání (nová složka, nový soubor) a Terminál.
Ikony jsou systémové SF Symbols a kreslí se jako maska: tvar vezmou
z obrázku a barvu dostanou z palety. Tvary jsou v src/renderer/icons.css
jako proměnné --i-*, tlačítko si o ně řekne přes class="ibtn" data-icon="…". Kde se tvar opakuje (ozubené kolo, okno terminálu), jen se
přejmenuje, nekreslí podruhé.
Barvu nese význam akce, ne umístění tlačítka. Modrá se pohybuje a hledá, tyrkysová srovnává dva panely, zelená nese k sobě, oranžová na server, fialová tvoří a mění, červená ubírá, šedá je nářadí. Nejvíc se to vyplatí u dvojic, které mají stejný tvar a liší se jen směrem: „k sobě" je vždycky zelená, „na server" oranžová, takže se to pozná dřív, než si člověk přečte tooltip. Kde si barvu určuje stav — zapnutý přepínač, zakázané tlačítko — ikona tu svou pouští, protože tam má být vidět stav, ne akce.
Tlačítko, které nese jen ikonu, nemá rámeček. Šedý obdélník kolem každé z nich dělal z lišty mřížku a držel symbol malý, aby se do něj vešel. Bez něj je vidět tvar, ne krabička. Podklad se vrací pod myší, ať je pořád poznat, že to jde zmáčknout, a zapnutý přepínač si výplň nechává — je to jediné, čím se pozná, že souběžné procházení nebo porovnání zrovna běží.
Popisky u tlačítek jsou vypnuté a akci prozradí tooltip; zapnout je jde v Nastavení → Vzhled. Do lišty se schválně nedostaly věci, které se dělají jednou za čas (import z WinSCP, vysypání koše, vlastnosti), a věci vázané na jednu stranu (zpět, vpřed, výš, domů, filtr, záložky cest) — ty zůstávají v hlavičkách panelů.
Každé připojení má vlastní záložku a nic se mezi nimi nesdílí — vlastní spojení pro procházení, vlastní zásobu spojení pro přenosy, vlastní frontu, hlídání složky i soubory otevřené v editoru. Přenos v jedné záložce tak nemůže spadnout kvůli tomu, co se děje v jiné, a přenosy vzadu běží dál. Že se v nich něco děje, ukazuje počet u názvu záložky.
Vlastní je i lokální panel a historie cest, takže přepnutí vrátí obě strany přesně tam, kde jste je nechali. Nová záložka přebírá lokální cestu z té, ve které stojíte — obvykle se pracuje na jednom projektu a jen střídají servery.
| Klávesa | Akce |
|---|---|
⌘O |
Připojit v nové záložce |
⌘W |
Zavřít záložku |
⌃Tab / ⌃⇧Tab |
Další / předchozí záložka |
Zavřít záložku s běžícími přenosy jde, ale aplikace se zeptá. Bez otevřené záložky zůstává použitelný aspoň lokální panel.
Obojí je v Nastavení → Relace; v liště tlačítko nemají, protože se importuje obvykle jednou a pak už nikdy.
Přirozenější zdroj pro Mac: vezmou se servery, uživatelé, porty, klíče
i brány (ProxyJump). Hesla tam nejsou — přihlašuje se klíčem.
Napodobujeme pravidla OpenSSH v rozsahu, který je k něčemu: platí první
nalezená hodnota (takže Host * funguje jako výchozí nastavení, ne jako
přepis), vzory se zástupnými znaky jsou šablony a samy se neimportují,
Include se načítá včetně hvězdičky v názvu. Bloky Match neumíme — jejich
podmínky nejde vyhodnotit bez skutečného spojení, tak se přeskakují.
WinSCP hesla nešifruje, jen obfuskuje reverzibilním algoritmem, jehož klíčem je
UserName + HostName. Importér je proto umí přenést včetně hesel.
Na Windows si vyexportujte konfiguraci jedním ze dvou způsobů:
- Ve WinSCP: Tools → Export/Backup Configuration… → uloží
WinSCP.ini - Nebo v
regeditexportujte klíčHKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2do.regsouboru
Soubor přeneste na Mac a v aplikaci zvolte Import z WinSCP…. Zobrazí se přehled nalezených relací s tím, u kterých se podařilo přečíst heslo, a vyberete si, co naimportovat.
- Master Password. Když ho máte ve WinSCP zapnuté, hesla jsou navíc zašifrovaná AES a takhle je vytáhnout nelze. Aplikace to pozná a upozorní. Řešení: ve WinSCP dočasně vypnout (Options → Preferences → Security), export zopakovat, pak zase zapnout.
- Klíče
.ppk. Cesta k privátnímu klíči je windowsová a formát PuTTY, který OpenSSH nečte. Klíč převedete přesputtygen klic.ppk -O private-openssh -o klica cestu doplníte v nastavení relace ručně.
Při prvním připojení přes SFTP aplikace ukáže otisk klíče serveru a zeptá se, co s ním. Otisk je ve stejném tvaru, jaký vypisuje OpenSSH, takže se dá ověřit z jiného počítače:
ssh-keyscan -p 22 server.example.com | ssh-keygen -lf -Máte tři možnosti: zrušit, připojit jednorázově (otisk se neuloží) nebo
připojit a zapamatovat. Známé servery z ~/.ssh/known_hosts se rozpoznají
samy a neptají se — včetně zahashovaných záznamů a záznamů s nestandardním
portem. Klíč označený v known_hosts jako @revoked se odmítne vždy.
Když se otisk uloženého serveru později změní, aplikace nepřipojí a ukáže oba otisky vedle sebe. Server mohl být přeinstalován, ale stejně tak se za něj někdo může vydávat — proto je předvyplněná odpověď „zrušit".
Dialog je záměrně systémový, ne součást okna aplikace: obsah stránky ho tak nemá jak napodobit. Změna serveru nebo portu u uložené relace otisk zahodí, aby nepotvrzoval něco jiného, než k čemu se připojujete.
U FTPS platí totéž. Když certifikát neprojde proti systémovým autoritám — typicky je podepsaný sám sebou, vystavený na jiné jméno nebo prošlý — ukáže se komu byl vydán, kdo ho vydal, do kdy platí a jeho otisk SHA-256. Ten je ve stejném tvaru, jaký vypíše OpenSSL, takže se dá porovnat:
openssl s_client -connect server.example.com:21 -starttls ftp \
| openssl x509 -noout -fingerprint -sha256Podstatné je kdy se ptáme: certifikát se kontroluje mezi TLS handshakem
a přihlášením. Kdyby se ověřoval až po připojení, jméno a heslo by u serveru,
který se za ten pravý jen vydává, už byly. Proto se nepoužívá access()
z knihovny, ale jeho kroky zvlášť.
Když se certifikát později vymění za jiný, kterému systém věří (běžná obnova u autority), uložený otisk se tiše srovná a nic nevyskočí. Výstraha přijde jen tehdy, když se otisk liší a systém novému certifikátu taky nevěří.
Únikový východ zůstává: Přijmout jakýkoliv certifikát bez ptaní. Je vypnutý a nedoporučuje se — s potvrzením otisku ho nepotřebujete.
Přenos se nikdy nezahájí přes existující soubor bez zeptání. Dialog ukáže velikost a čas obou verzí a nabídne:
| Volba | Co udělá |
|---|---|
| Přepsat | Nahradí cíl zdrojem |
| Navázat | Doplní jen chybějící konec (jen když je cíl kratší) |
| Přeskočit | Nechá cíl být |
| Jen když je novější | Přenese jen tehdy, je-li zdroj novější |
| Přejmenovat | Uloží jako název (2).přípona |
| Zrušit vše | Vyprázdní frontu |
Zaškrtnutím Použít na všechny další se volba uplatní na zbytek fronty; po jejím vyprázdnění se zase ptá. Klávesa Esc znamená přeskočit, nikdy přepsat.
Nezeptá se ve dvou případech, kdy už rozhodnutí padlo jinde: u synchronizace (přepis jste odsouhlasili v náhledu) a při ukládání souboru otevřeného v editoru (přepsat vzdálený soubor je přesně to, co uložení znamená).
Lokálně se mazalo do systémového koše a na serveru nevratně. Nově se i na serveru maže přesunem — položka se přejmenuje pod složku koše a zachová si původní cestu:
/var/www/html/index.php → ~/.charon-trash/2026-08-16/var/www/html/index.php
Přesun je jen přejmenování, takže nestojí žádný přenos dat. Když ho server odmítne (koš by byl na jiném svazku), aplikace to ohlásí a nesmaže natvrdo jako náhradní řešení.
Nastavuje se u každé relace zvlášť — složka koše i automatický úklid po zadaném počtu dní. Ruční vysypání je v nabídce Soubor a v kontextovém menu serverového panelu. Mazání s klávesou Shift koš obejde a smaže rovnou.
Nedokončené přenosy se ukládají průběžně, takže se o ně nepřijde, když se aplikace zavře nebo spadne uprostřed nahrávání. Při dalším připojení ke stejné relaci se Charon zeptá, jestli je má vrátit do fronty.
Pomáhá tomu i přenos přes dočasný název —
rozepsaný .filepart na disku zůstane, takže se navazuje tam, kde se přestalo,
a nezačíná se od nuly. Když nabídku odmítnete, zapomene se; cílový soubor
zůstane nedotčený, protože nedokončený přenos se do něj ještě nepromítl.
Výpadek linky ani restart serveru neznamená, že se musíte připojovat ručně. Charon to pozná, ohlásí to ve stavovém řádku a zkusí se připojit znovu — třikrát, s prodlevou 1, 3 a 8 vteřin. Záložka i stavový řádek mezitím ukazují připojuji (tečka u názvu pomalu bliká).
Když se to povede, rozdělaná fronta pokračuje dál a navazuje na to, co už se přeneslo. Když ne, relace zůstane odpojená a připojíte se sami — opakovat to donekonečna by jen zbytečně bušilo do serveru, který třeba záměrně neběží.
Zavřete-li záložku sami, nic se neobnovuje.
Server, který není vidět z internetu, bývá dostupný přes jiný stroj. V dialogu relace je na to sekce Cesta k serveru (jen SFTP; FTP potřebuje kromě řídicího ještě datová spojení a ta by tudy neprošla):
| Nastavení | K čemu |
|---|---|
| Brána (jump host) | SSH stroj, přes který se protáhne spojení k cíli — obdoba ssh -J |
| Proxy SOCKS5 | Typicky firemní síť; podporuje i jméno a heslo |
| Proxy HTTP CONNECT | Totéž přes HTTP proxy |
Dá se to kombinovat: proxy vede k bráně, brána k cíli. Adresu cíle posíláme proxy jménem, aby si ji přeložila sama — na vaší straně by se přeložit nemusela.
Klíč brány se ověřuje stejně přísně jako klíč cíle. Je to stroj, kterým jde všechno ostatní, takže na něm záleží nejvíc; při prvním připojení se na jeho otisk zeptáme zvlášť. Bez potvrzeného klíče se spojení neotevře.
Hesla k bráně i k proxy se ukládají zašifrovaná stejně jako ta ostatní.
Okno → Pracovní plochy (⇧⌘O) uloží sadu právě otevřených záložek i s tím,
v jaké složce jsou na obou stranách. Příště ji otevřete jedním kliknutím —
hodí se, když se pravidelně vracíte ke stejné skupině serverů.
Ukládají se jen záložky z uložených relací; u jednorázového připojení není co otevřít. Když se některá relace nepřipojí, ostatní se otevřou i tak a řekne se, kolik jich z kolika vyšlo.
| Co | Kde |
|---|---|
| Relace | ~/Library/Application Support/charon/sites.json |
| Nastavení a pracovní plochy | ~/Library/Application Support/charon/settings.json |
| Nedokončená fronta | ~/Library/Application Support/charon/queue.json |
| Šifrovací klíč k heslům | macOS Keychain, položka Charon |
| Dočasné soubory otevřené v editoru | $TMPDIR/charon-edit/ |
Hesla se do sites.json zapisují zašifrovaná (AES-256-GCM); klíč leží
v Keychain, ne v souboru.
Do okna se neposílají — s jedinou výjimkou, kterou je oko u pole s heslem v editoru relace. Kliknutí si řekne hlavnímu procesu o jedno jediné pole, to se rozšifruje a ukáže; zhasnutím nebo zavřením dialogu se z pole zase smaže. Jiné pole než heslo tou cestou ven neprojde. Bezpečné to samozřejmě není o nic víc než heslo napsané na obrazovce — je to pro chvíle, kdy ho potřebujete opsat jinam a nechcete kvůli tomu do Keychainu.
Kreslená, leží v build/icon.png. Charon je převozník, který vozí duše přes
Styx — tedy přesně to, co aplikace dělá se soubory: bere je z jednoho břehu na
druhý. Proto postava v kápi s bidlem ve dřevěném člunu na vlnách.
npm run iconVykreslí předlohu do všech velikostí, které macOS chce, a složí
build/icon.icns. Rasterizérem je Chromium z Electronu — přidávat kvůli jedné
ikoně další závislost by bylo víc práce než užitku. Na Retině vrací snímek
dvojnásobek bodů, takže se výsledek ještě srovnává na přesnou velikost;
iconutil na ni trvá.
Předloha může být obrázek (icon.png) nebo kresba (icon.svg); PNG má
přednost, aby šlo dodanou grafiku nasadit, aniž by se přepisovala kresba.
Formát není podmínka — .icns je stejně jen sada PNG a SVG v tom řetězci
bylo vždycky jen zdrojem. Ať má předloha aspoň 1024 × 1024, jinak se největší
velikost roztáhne a rozmaže.
Rámeček si kresba v SVG nese sama, dodaný obrázek ne — ten se orámuje až při vykreslení, na Applovu mřížku: obsah je čtverec 824 bodů uprostřed plátna 1024 se zaoblením 185 a zbytek nechává místo na stín. Bez toho by v Docku mezi zaoblenými dlaždicemi svítil hranatý čtverec.
Obrázek se v dlaždici ještě o 12 % přiblíží. Kreslí se obvykle s rezervou kolem — u téhle předlohy zabírá kresba 86 % šířky a 78 % výšky — a v malých velikostech se pak motiv scvrkne do nečitelna. Hodnota je spočítaná tak, aby se krajní tahy ještě vešly dovnitř; kdyby se předloha vyměnila za jinak zarámovanou, patří přepočítat.
Rozhoduje malá velikost: v 32 bodech z ikony zbude jen silueta. Zkontrolovat
se to dá kontaktním listem — hotová PNG z build/icon.iconset/ vedle sebe
ve 256, 128, 64, 48 a 32 bodech.
Nastavení → Vzhled. Písmo rozhraní a písmo pro cesty a výpisy se vybírají z toho, co máte v systému; u druhého jsou nabídnutá jen neproporcionální (poznají se změřením — v takovém písmu je „i" stejně široké jako „W").
Velikost písma platí pro seznamy souborů, kde na ní záleží nejvíc; výška
řádku se přizpůsobí sama. Zvětšit celé rozhraní jde přiblížením
(⌘+, ⌘−, ⌘0) — to je ostřejší a nic se nerozsype, protože se zvětší
všechno proporcionálně, ne jen text.
Voleb je přes třicet, takže je dialog rozdělený na oddíly: Přenosy, Editor, Vzhled, Panely, Síť, Relace. Formulář zůstává jeden a všechna pole v něm — schovávají se jen oddíly, takže ukládání neřeší, co je zrovna vidět.
Nastavení → Relace → Repozitář na GitHubu. Zjistí se jen to, že je venku novější vydání, a dostanete odkaz — nic se nestahuje ani neinstaluje; automatická instalace by potřebovala podepsanou aplikaci. Dokud repozitář nezadáte, nekontroluje se nic: předstírat kontrolu, když není kam se dívat, je horší než ji nemít.
Verzi a na čem to běží ukáže Charon → O aplikaci Charon.
Nastavení → Vzhled → Motiv nabízí Podle systému (výchozí), Světlý a Tmavý. Volba platí i pro systémové dialogy, rám okna a posuvníky.
Barvy jsou v jednom bloku na začátku styles.css a každá je zapsaná jednou,
funkcí light-dark(). Přepnutí motivu je pak jediná vlastnost na <html>:
bez ní rozhoduje systém, s data-theme uživatel. Že se barva nezačne psát
natvrdo někde v pravidlech, hlídá test/theme.test.js — v tom druhém motivu
by se to projevilo jako nečitelné místo a všiml by si toho až uživatel.
Název, Typ (přípona), Velikost, Změněno, Práva a volitelně Vlastník a Skupina. Kliknutím na hlavičku se řadí, druhé kliknutí obrátí směr; složky zůstávají nahoře vždycky. Podle typu se řadí sekundárně názvem, jinak by se soubory téže přípony při každém překreslení zamíchaly jinak.
Přípona se bere ze src/common/filekind.js — tedy odtud, odkud se určuje
ikona. Dvě místa s vlastními pravidly by se dřív nebo později rozešla a jeden
soubor by byl jednou .env, jindy nic.
Šířku měníte tažením za dělicí čáru v hlavičce. Táhne se hranice mezi dvěma sloupci: co se přidá levému, ubere se pravému, takže se hýbe jenom ta jedna čára a zbytek hlavičky zůstane stát. Název je pružný a dorovnává, co ostatní pustí; za posledním sloupcem se netáhne, vpravo od něj už není co zúžit. Hranice jsou vidět i v klidu — jinak se místo, kde chytit, hledá po hmatu.
Šířky platí pro oba panely naráz — jinak by se stejné sloupce vlevo a vpravo rozešly a porovnávat by se nedalo — a pamatují se do příště. Dvojklik na čáru vrátí oběma sousedům výchozí šířku. Zapnout a vypnout jednotlivé sloupce jde v Nastavení → Panely → Sloupce.
Každá položka v panelu má ikonu podle toho, co to je — složka, obrázek, video, archiv, zdrojový kód, klíč, nastavení. Typ se určuje z názvu: obsah bychom si kvůli tomu museli z serveru stáhnout, a to u složky s tisíci soubory nepřipadá v úvahu.
Rozhoduje src/common/filekind.js. Kromě přípony zná i soubory, které žádnou
nemají (.htaccess, .env, Dockerfile, Makefile), a případy, kde přípona
mate:
| Soubor | Škatulka | Proč |
|---|---|---|
logo.svg |
obrázek | technicky je to značkovací jazyk, ale člověk čeká obrázek |
navrh.key |
prezentace | .key je Keynote; klíče bývají .pem nebo .pub |
index.php |
zdrojový kód | MIME má sice application/…, kód to je pořád |
vykaz.csv |
tabulka | otevírá se v tabulkovém procesoru, ne v editoru |
.env.local |
nastavení | odvozeniny .local, .example a spol. se poznají taky |
Stejný modul plní sloupec Typ v dialogu vlastností, kde je vidět i celý MIME. Panel a vlastnosti se tak nemůžou rozejít v tom, co je co.
Ikony se kreslí jako maska, ne jako obrázek: tvar vezme z obrázku a barvu dostane z palety. Proto samy zesvětlají v tmavém motivu a zbělají na vybraném řádku, aniž by musely existovat dvakrát. Na 924 položkách je vykreslení stejně rychlé jako bez nich (16,5 vs. 16,6 ms) — dvacet různých tvarů si prohlížeč dekóduje jednou.
Tvary jsou systémové SF Symbols, vykreslené do PNG s alfa kanálem:
npm run iconsKreslí je tools/sf-icons.swift, spouští se ručně a hotové soubory leží
v src/renderer/icons/. K sestavení aplikace Swift potřeba není.
Vektor z SF Symbols ven nevede: symboly jsou zamčené v Assets.car a i
NSImage.draw do PDF z nich udělá bitmapu. Kreslí se proto s velkou rezervou
(hrana 128 px na ikonu zobrazovanou ve 20), aby zůstaly ostré i po přiblížení
okna. Masce barevný kanál nevadí — čte se jen průhlednost.
Všechny symboly jdou do stejně velkého čtverce a při stejné velikosti písma.
Kdyby se každý ořízl na svůj vlastní obrys, tenká šipka by se roztáhla na
velikost složky; takhle zůstanou poměry, jak je Apple navrhl. Rámeček je
proto o kus větší než běžný symbol a zbylé volno se dorovná až v CSS. Nástroj
hlídá, že se do něj vejde i ten největší — po zvýšení váhy tahu na semibold
symboly povyrostly a rámeček se musel zvětšit s nimi.
V dialogu relace je sekce Rozlišení relace: barva a poznámka. Barva obarví záložku i hlavičku serverového panelu, poznámka se v hlavičce vypíše. Se záložkami, kde je otevřeno víc serverů naráz, je to nejlevnější pojistka proti smazání něčeho na špatném stroji.
Návrat do složky, kterou jste právě viděli, je okamžitý. Uložený výpis platí
půl minuty a jakýkoliv zápis na server ho zahodí celý — přejmenování, mazání
i dokončený přenos. Zahazuje se schválně víc, než by bylo nutné: nejhorší, co se
tím stane, je jedno načtení navíc, kdežto zastaralý výpis vede k mazání souboru,
který už neexistuje. ⌘R se paměti neptá nikdy. Vypnout se dá v nastavení.
Vyberte víc položek a v kontextovém menu zvolte hromadné přejmenování. Najít
a nahradit, volitelně regulárním výrazem, jen na jméně / jen na příponě / na
celém názvu, a {n} vloží pořadové číslo (od kolika, po kolika, na kolik míst).
Náhled se přepočítává při každé změně a přejmenovat nejde, dokud v něm je konflikt: dva soubory pod stejným názvem, lomítko v názvu nebo název, který už ve složce je. Přejmenování je nevratné, takže se radši nedělá nic.
Kroky se navíc řadí tak, aby se nic nepřepsalo ani při posunu názvů
(1 → 2 a zároveň 2 → 3): kolidující soubor se nejdřív odklidí pod dočasný
název. Z rozhraní se takový případ vyrobit skoro nedá, ale modul počítá plán
pro kohokoliv, kdo ho použije.
V kontextovém menu panelu je Otevřít Terminál zde. Lokálně se otevře
v dané složce. U serveru se sestaví příkaz ssh (včetně portu, klíče a brány)
a vloží se do schránky — spustit ho za vás by znamenalo psát příkazy do
cizího shellu a heslo bychom tam stejně nedostali. Název složky se uzavírá do
apostrofů; že z něj nemůže vzniknout příkaz, hlídá test/terminal.test.js
skutečným /bin/sh.
V kontextovém menu serverového panelu:
- Duplikovat na serveru — kopie bez stahování. Zkusí se
cppřes shell, takže data server vůbec neopustí. Když shell není k dispozici (nebo je SFTP uzavřené v jiném kořeni než shell), kopie proteče přes tento počítač a řekne se to. - Vytvořit odkaz — symbolický odkaz. Jen SFTP; FTP na to nemá příkaz.
- Změnit čas změny — ruční nastavení razítka, i pro víc položek naráz.
Nová složka (F7) a nový prázdný soubor (⌘N, případně ⇧F4 ze zvyku po WinSCP) vzniknou v té složce, kterou má panel právě otevřenou — na obou stranách stejně. Jde na ně tlačítko v liště panelu, položka v nabídce Soubor i kontextové menu.
Existující soubor se nikdy nepřepíše: na SFTP se zakládá s příznakem „vytvoř, jen když ještě není", takže o hotovou práci nejde přijít ani tehdy, když soubor mezitím vznikne. FTP takový příkaz nemá, tam se existence zjišťuje dotazem předem. Nová položka zůstane vybraná, takže se dá rovnou otevřít v editoru (F4).
Kontextové menu se otevře i vedle položek — kliknutí do volného místa pod výpisem výběr zruší, aby nabídka nabízela jen to, co se týká složky.
V Nastavení → Editor se dají zapsat pravidla maska = aplikace oddělená
svislítkem, třeba *.png; *.jpg = Preview | *.sql = TablePlus. Platí první,
které sedne, takže obecné patří nakonec. Bez pravidla se použije výchozí
editor; bez něj rozhodne systém — u obrázku nebo PDF je to jediné rozumné.
Nastavení → Síť. Keepalive drží spojení při nečinnosti; 0 ho vypne.
Některé servery ho totiž nesnesou a spojení kvůli němu naopak zavřou — když
vám relace padá právě při nečinnosti, zkuste nulu.
Aktivní režim FTP (PORT/EPRT) Charon neumí: knihovna, na které stojí
FTP, implementuje jen pasivní režim. Anonymní přihlášení zaškrtnete u relace.
⇄ Porovnat (⌘D) obarví u kraje řádku, co se liší proti druhé straně:
zelená je novější tady, oranžová starší, modrá tu je navíc. Jen v aktuální
složce — do hloubky je od toho synchronizace. Barvou se schválně nesahá na
text; ten už nese význam podle typu souboru.
⇉ Synchronizované procházení (⌘Y) udělá tentýž krok i v druhém panelu.
Mirroruje se jen vstup do podsložky a návrat o úroveň výš; u skoku někam
jinam by se druhá strana ocitla na cestě, která s ní nemá nic společného.
Když protějšek neexistuje, řekne se to a druhá strana zůstane, kde byla.
⌘L otevře připojení z adresy typu sftp://uzivatel@server:2222/var/www.
Relace se nikam neukládá, je to jednorázové připojení. Schéma se dá vynechat
(předpokládá se SFTP), heslo v adrese se použije.
Opačně: Kopírovat adresu této složky v kontextovém menu serverového panelu. Heslo se do zkopírované adresy nikdy nedostane — taková adresa se často ocitne v chatu nebo v ticketu, kde už zůstane.
V dialogu ⇧F5 se dá vybrat pojmenovaný profil: maska, „jen nové a změněné", práva nahraných souborů a textový režim. Profil platí jen pro ten jeden přenos — nastavení aplikace nemění. Jinak by se jednorázová odchylka („na tenhle server nahraj s právy 755") tiše stala trvalou a projevila by se příště úplně jinde.
Profily nepřežijí obnovení fronty po restartu: nedokončeným položkám se ukládá cesta a postup, ne volby, se kterými byly zařazené.
Nastavení → Editor → Zaznamenávat komunikaci se serverem. Ve stavovém řádku je vidět závěr, v záznamu celý rozhovor — u serveru, který se chová divně, je to jediné, co pomůže.
Hesla se do záznamu nedostanou (PASS se zkracuje, stejně tak heslo v adrese).
Soubor je jeden na den, leží v ~/Library/Application Support/charon/logs/
a nad 5 MB se odloží stranou.
| Klávesa | Akce |
|---|---|
F5 |
Zkopírovat vybrané do druhého panelu |
⇧F5 |
Přenést s volbami (cíl a maska) |
F6 |
Přesunout vybrané do druhého panelu |
F4 |
Upravit vzdálený soubor v editoru |
⌘N / ⇧F4 |
Nový prázdný soubor v zobrazené složce |
F2 |
Přejmenovat |
F7 |
Nová složka |
⌫ |
Smazat do koše (lokálního i serverového) |
⇧⌫ |
Smazat natrvalo, s vynecháním koše |
Tab |
Přepnout panel |
Enter |
Otevřít složku / soubor |
⌘A |
Vybrat vše |
+ / − |
Vybrat / odznačit podle masky |
⌘[ / ⌘] |
Zpět / vpřed v historii cest |
⌘F |
Filtr (vlevo) nebo hledání na serveru (vpravo) |
| psaní | Skok na položku podle názvu |
⌘R |
Obnovit oba panely |
⌘S |
Synchronizace adresářů |
⌘U |
Hlídat složku a nahrávat změny |
⌘L |
Příkazy na serveru |
⌘I |
Vlastnosti vybraného |
⌘O |
Připojit v nové záložce |
⌘W |
Zavřít záložku |
⌘, |
Nastavení |
Dvojklik na vzdálený soubor (nebo F4) ho stáhne do dočasné složky, otevře
v editoru a hlídá. Při každém uložení se sám nahraje zpět na server — bez
dalšího kliknutí.
Před nahráním se ale ověří, že se soubor na serveru mezitím nezměnil. Když do
něj sáhl někdo jiný, Charon se zeptá a ve výchozím stavu nenahraje —
zahodit cizí změnu je horší než neuložit vlastní. Když se stav zjistit nedá
(server nehlásí čas, spadlo spojení), ukládá se bez ptaní; jinak by se
u takového serveru nedalo uložit vůbec nic. V Nastavení si můžete zvolit editor (např.
Visual Studio Code); prázdné pole znamená výchozí aplikaci podle přípony.
Ve výchozím stavu běží 3 přenosy naráz, každý přes vlastní spojení (Nastavení → Přenosy, 1 až 16). Je to znát hlavně u spousty malých souborů, kde rozhoduje latence, ne šířka pásma — při odezvě 20 ms je čtyřnásobná souběžnost v testech asi 4× rychlejší. Na rychlé lince s jedním velkým souborem rozdíl nečekejte.
Servery počet spojení z jedné adresy často omezují. Když další nepovolí, Charon se sám zmenší na to, co prošlo, napíše to do stavového řádku a pokračuje — přenosy kvůli tomu neselžou.
Soubor se přenáší pod jménem <název>.filepart a na cílové se přejmenuje až
po dokončení. Do té chvíle zůstává původní soubor nedotčený — na živém webu
tak návštěvník nikdy netrefí poloviční PHP soubor. Stejná přípona jako ve
WinSCP, takže je i z jiného klienta na první pohled vidět, co se stalo.
Přejmenování se dělá přes rozšíření posix-rename@openssh.com, které cíl
nahradí jedním krokem a bez okamžiku, kdy soubor neexistuje. Když ho server
nemá, zbývá smazat a přejmenovat.
Co se stane při přerušení:
| Situace | Rozepsaný soubor |
|---|---|
| Pauza | zůstane — je z čeho navázat |
| Chyba | zůstane — opakování na něj naváže |
| Zrušení | uklidí se, aby po sobě nenechal nepořádek |
Cizí rozepsaný soubor z dřívějška se nikdy nepoužije mlčky. Dialog při přepisu navázání nabídne (a počítá s velikostí rozepsaného souboru, ne hotového pod cílovým jménem), ale rozhodnutí necháme na vás — mohl by pocházet z jiné verze zdroje.
Vypnout jde v Nastavení → Přenosy; tam se dá nastavit i spodní hranice velikosti. Přejmenování je jedno kolo navíc na soubor, takže u tisíců drobných souborů přes pomalou linku se vyplatí ho pro ně přeskočit.
Nastavení → Přenosy → Víc spojení na jeden soubor od (MB). Velký soubor si
rozdělí víc spojení mezi sebe, každé stahuje svůj úsek do jednoho souboru na
svou pozici. Výchozí je vypnuto (0).
Má to smysl, když server škrtí jeden proud, ale celkem pustí víc — což je na sdíleném hostingu běžné. Změřeno proti serveru s odezvou 12 ms: 8 MB jedním spojením 5,3 s, čtyřmi 1,4 s, tedy 3,7× rychleji. Na místní síti se nezmění nic.
Zatím jen stahování přes SFTP; FTP by na to potřebovalo pro každý úsek zvlášť řídicí spojení a odstřelovat přenos po přečtení N bajtů, což je křehké.
Tři věci, které z toho plynou:
- Spojení navíc se berou, jen když jsou volná. Kdyby se na ně čekalo, vzal by si segmentovaný přenos to, co potřebuje jiná položka fronty, a fronta by uvázla sama o sobě. Když nezbývá nic, teče to jedním proudem.
- Přenáší se vždycky přes dočasný název, i když je jinak vypnutý. Kdyby jeden úsek selhal, zůstal by na cíli soubor správné velikosti s dírou uvnitř — a to se pozná až při použití.
- Nenavazuje se. Dokud přenos nedojede, je v souboru díra a z velikosti se nic nepozná. Nejde to dohromady ani s textovým režimem, protože úseky by se rozešly na hranicích převodu.
Fronta hlásí, kolik toho zbývá a jak dlouho to potrvá. Rychlost se měří jako průtok celé fronty v posuvném okně osmi vteřin — rychlost jednotlivé položky je průměr od jejího začátku, takže po dokončení ze součtu zmizí a odhad by poskočil.
Když u některé položky neznáme velikost, odhad se neukáže a napíše se, kolika položek se to týká. Odhad, který nemůže vyjít, je horší než žádný.
Volby jsou tři: nechat na serveru (výchozí), nastavit pevně, nebo zachovat lokální. Soubory a složky se nastavují každé zvlášť — u složek zachovávat není co, vznikají až na serveru, takže se řídí pevnou hodnotou vedle.
Nastavit je jde na třech místech a dědí se odshora dolů:
| Kde | Platí pro |
|---|---|
| Nastavení → Přenosy | všechny servery |
| relace → Práva nahraných souborů | jeden server |
| Přenést s volbami | jednu dávku |
Nižší úroveň nenabízí volbu „podle té vyšší" — rovnou se do ní opíše, co platí, a kdo to chce přebít, hodnotu přepíše. Uloží se jenom ta odchylka, takže co zůstane, jak bylo, se dál řídí vyšší úrovní včetně jejích pozdějších změn.
Zadává se jedno číslo — práva souborů — a k němu volba Složkám přidat procházení, stejně jako ve Vlastnostech: 644 → 755, 640 → 750, 664 → 775. Dvě nezávislá pole vedle sebe nutila psát oba údaje pokaždé znovu, přitom se lišila právě jen tímhle bitem. Ukazuje se jen to, co při zvolené volbě něco znamená — u „nechat na serveru" žádné číslo, u „zachovat lokální" jen práva složek, protože soubory si ta svá přinesou z disku.
Dialog Přenést s volbami nad poli píše, odkud se předvyplnila.
Ve Vlastnostech vybrané položky na serveru se zadává jedno číslo — práva
souborů — a složky se od něj odvozují volbou Složkám přidat spouštění:
644 → 755, 640 → 750, 664 → 775. Spouštění u složky znamená „smí se do ní
vstoupit", takže hromadné chmod -R 644 na celý web je přesně ten způsob, jak
si ho zamknout; proto je volba zapnutá. Se zaškrtnutím Použít i na podsložky
a soubory uvnitř se tím jedním zadáním přenastaví celý strom.
Pole pro složky se ukazuje jen tam, kde má co dělat: u vybraného souboru žádná volba pro složky není, u samotné složky bez rekurze je zadané číslo přímo její.
Osmičkový zápis je všude doprovázený jednou zaškrtávací mřížkou (vlastník /
skupina / ostatní × čtení / zápis / spouštění) a pod ní zápisem, jak ho ukazuje panel —
rwxr-xr-x. Obojí je tatáž hodnota: kdo umí 755, napíše ho, kdo ne, zaškrtá.
Prázdné pole zůstává prázdné, dokud se do mřížky neklikne; zvláštní bity
(setuid, setgid, sticky) mřížka nenabízí, ale když je v poli někdo má, zůstanou
tam. Totéž ovládání je i ve Vlastnostech vybraného souboru na serveru.
Práva se nastavují až na konečné cestě, aby to dopadlo stejně s dočasným názvem
i bez něj. Týkají se jen nahrávání — při stahování rozhoduje místní systém, a
proto se v dialogu při stahování ani nenabízejí. Když je server nastavit neumí
(starší FTP bez SITE CHMOD), přenos kvůli tomu neselže a jen se to připíše
k položce.
Změna práv u otevřené relace platí hned, na příští připojení se nečeká.
⌘, nebo ozubené kolo vpravo v liště. Vlevo oddíly, vpravo jeden po druhém —
jako v systémových nastaveních. Paměť výpisů složek sedí v Síti, ne ve
Vzhledu: rozhoduje o tom, kdy se server ptáme znovu, ne o tom, jak co
vypadá.
Uvnitř oddílu má každá skupina voleb nadpis a pod ovládacím prvkem sedí vysvětlivka: proč to tam je a co se stane, když se to přehodí. Vysvětlivky mají omezenou šířku na zhruba sedmdesát znaků a menší písmo, aby nepřebily to, co se ovládá — a hlavně proto, že dialog se roztahuje podle nejdelšího řádku, takže neomezená próza dřív rozjela okno přes celou obrazovku. Sloupec s volbami má pevnou šířku, jinak se okno při každém přepnutí karty přeskládá.
Nastavení → Přenosy → Textový režim: maska souborů, kterých se to týká,
a jaké konce řádků má mít soubor na serveru. Při stažení se sjednocuje vždycky
na LF (konvence macOS), při nahrání podle volby.
Skript s CRLF se na Unixu neprovede a .bat s LF zase na Windows —
tohle je jediný způsob, jak to řešit jinak než ručně.
Dvě věci, které z toho plynou:
- Navazování přerušeného přenosu se v textovém režimu nepoužije. Po převodu neodpovídá počet bajtů zdroji, takže „dopiš od pozice N" by soubor rozsypalo. Soubor se radši přenese celý.
- Soubor má na druhé straně jinou velikost, proto se u něj jen nové a změněné neřídí velikostí, ale jen časem změny. Jinak by se přenášel pořád dokola.
Binární soubory, které se do masky připletou, se nepoškodí: osamocené CR se
nemaže a žádný jiný bajt se nemění. Ale masku je stejně lepší psát úzce.
Koš na serveru řeší mazání, tohle přepis — druhý způsob, jak přijít o data,
a na rozdíl od mazání se děje bez ptaní pokaždé, když nahrajete novější verzi.
V Nastavení → Přenosy se dá zvolit odložení vedle jako .bak-datum, nebo
přesun do koše na serveru.
Záloha se dělá jen při plném nahrání; při navazování rozepsaného přenosu ne — tam už je stejně přepsáno. Když se nepovede, přenos kvůli tomu neselže a jen se to připíše k položce.
Fronta se přenáší v pořadí, v jakém do ní položky přibyly, ale ukazuje se setříděná podle stavu: nahoře to, co se právě přenáší, pod tím chyby, pak pozastavené a čekající, dole hotové. U dávky o tisících souborech je jinak běžící přenos někde uprostřed seznamu a musíte ho hledat. Uvnitř skupiny zůstává pořadí fronty, takže „posunout nahoru" u čekající položky je vidět tam, kde se čeká.
Řadí se jen zobrazení. Co přijde na řadu, se tím nemění — běžící přenos přeskočit stejně nejde.
Vedle tlačítka Vyčistit hotové je zaškrtávátko průběžně: hotový soubor zmizí ze seznamu hned, jak se přenese, takže v něm po celou dobu zůstává jen to, co se ještě neudělalo. Chyby a přeskočené položky zůstávají — ty chcete vidět. Odklizené položky se pořád počítají do souhrnu, který se ohlásí po dokončení fronty.
Vpravo v hlavičce fronty je volba Po dokončení: nic, upozornit, odpojit, uspat Mac. Rozhoduje se o ní ve chvíli, kdy se pouští velký přenos, proto je u fronty a ne schovaná v nastavení.
Odpojení ani uspání se neprovede, když něco selhalo — po chybě chce člověk vidět, co se stalo, ne najít ráno uspaný počítač.
Nastavuje se v Nastavení → Přenosy v kB/s, nebo pravým tlačítkem na položku ve frontě. Globální limit platí dohromady pro všechny běžící přenosy, ne na každý zvlášť — zadáváte, kolik smí Charon ubrat z linky. Položka může mít navíc vlastní limit; pak platí oba a rozhoduje ten přísnější.
Model je „děravý kbelík" se zásobou na jednu sekundu dopředu, takže po chvíli nečinnosti přenos nevystřelí na několikanásobek limitu.
Stejný zápis se používá na filtr v panelu, na výběr klávesami + a −
i na hledání:
| Zápis | Význam |
|---|---|
* |
libovolný počet znaků |
? |
právě jeden znak |
[abc], [a-z] |
jeden znak z výčtu nebo rozsahu |
[*] |
hvězdička jako obyčejný znak |
a; b nebo a, b |
víc masek najednou |
vzor | výluka |
za svislítkem je výluka, ta má přednost |
slozka/ |
platí jen pro složky |
Nezáleží na velikosti písmen. Příklad: *.php; *.css | .git/; node_modules/
vybere PHP a CSS, ale vynechá dvě složky.
Filtr nikdy neschovává složky — jinak by se nedalo doklikat níž.
Na složky se schválně uplatní jen výluky. Kdyby platilo i zahrnutí, maska
*.php by zakázala vstup do každé podsložky a rekurzivní přenos by nenašel nic.
Vyloučit .git/ naopak smysl dává.
Maska platí i na položky, které jste označili ručně. Když je ve výluce
node_modules/, nenahraje se, ani když ji vyberete a zmáčknete F5 — jinak by
se na masku nedalo spolehnout.
Kolik položek maska vynechala, se vždycky napíše do stavového řádku. Tiché vynechání by vypadalo, jako by se přeneslo všechno.
Maska se nastavuje na třech místech:
| Kde | Platnost |
|---|---|
| Nastavení → Přenosy | výchozí pro každé F5 a přetažení |
| ⇧F5 (Přenést s volbami) | jen pro ten jeden přenos, volitelně se uloží jako výchozí |
| Dialog synchronizace | jen pro to porovnání |
U synchronizace platí maska na obě strany. Kdyby platila jen na jednu, soubory vyloučené vlevo by se vpravo tvářily jako přebytek k smazání.
U přesunu (F6) se výchozí maska záměrně nepoužívá — vynechaný soubor by zůstal na zdroji a člověk by si myslel, že přesunul všechno.
⌘F v pravém panelu (nebo Soubor → Najít soubory na serveru) projde strom od
zadané cesty a hledá podle masky. Nálezy přibývají průběžně, takže se dá začít
pracovat dřív, než hledání doběhne, a kdykoliv ho jde zastavit. Z výsledků se dá
rovnou stahovat, otevřít soubor v editoru nebo skočit na jeho místo v panelu.
Hledání se zastaví na 5000 nálezech a hloubce 40 úrovní — obojí je pojistka proti překlepu v masce, ne technický limit.
⌘I nebo Vlastnosti… v kontextové nabídce serverového panelu. Ukáže velikost,
čas, práva, vlastníka a skupinu; umí je i změnit.
Práva se zadávají zvlášť pro soubory a zvlášť pro složky. Není to
zbytečné rozlišování: 644 na složce by ji znepřístupnilo, takže vedle sebe
patří 644 a 755. Prázdné pole znamená „neměnit". Rekurzivní použití se
před spuštěním ptá.
Vlastník a skupina se u SFTP zadávají čísly (UID a GID) — jména protokol nezná.
Kontrolní součet se počítá na serveru příkazem (sha256sum, shasum,
md5sum — zkouší se postupně), takže se nemusí nic stahovat. U FTP se zkusí
XMD5/XCRC, které ale spousta serverů nemá; pak to Charon řekne.
⌘L otevře konzoli: napíšeš příkaz, uvidíš výstup i návratový kód. Šipkami
nahoru a dolů se prochází historie. Funguje jen přes SFTP — FTP shell nemá
a Charon to rovnou řekne, místo aby se tvářil, že se nic nestalo.
Každý příkaz běží v samostatném neinteraktivním shellu, takže cd mezi příkazy
nedrží. Pracovní adresář se proto vkládá před příkaz a bere se z pravého panelu
— jinak by všechno běželo v domovském adresáři, což je proti očekávání člověka,
který kouká na otevřenou složku.
Soubor → Vlastní příkazy… Pojmenované příkazy nad vybranými soubory, které se pak objeví v kontextové nabídce panelu. Běží buď na serveru, nebo na tomhle počítači.
| Zápis | Význam |
|---|---|
! |
cesta k vybranému souboru |
!N |
název souboru bez cesty |
!& |
všechny vybrané soubory |
!/ |
vzdálený adresář |
!\ |
lokální adresář |
!?Otázka?výchozí! |
zeptá se před spuštěním |
!! |
samotný vykřičník |
Volba Spustit zvlášť pro každý vybraný soubor spustí příkaz tolikrát, kolik je vybraných položek; jinak proběhne jednou se všemi.
Dosazené hodnoty se samy uzavírají do apostrofů, takže vlastní uvozovky
psát nemusíte. Je to hlavně pojistka: název souboru si nevybírá ten, kdo příkaz
psal, a soubor pojmenovaný a; rm -rf ~ se nesmí stát částí příkazu. Na to je
zvláštní test proti skutečnému shellu.
Příklady:
grep -n !?Co hledat?TODO! !N # najde v souboru, zeptá se na co
tar czf zaloha.tgz !& # zabalí všechny vybrané
php -l ! # zkontroluje syntaxi
open !\ # otevře lokální složku ve Finderu
⌘U nebo Soubor → Hlídat složku a nahrávat změny. Charon sleduje lokální
strom a každou změnu rovnou nahraje — uložíš soubor v editoru a je nahoře.
Ve WinSCP se tomu říká Keep remote directory up to date.
Volba Nejdřív srovnat, co se liší projede obě strany a dorovná rozdíly, než se začne hlídat. Bez ní se nahrává jen to, co se změní potom.
Platí tu maska, takže .git/ a node_modules/ se dají vyloučit. Rozepsané
soubory .filepart se ignorují vždycky — vznikají při stahování do hlídané
složky a nahrát je zpátky by byl kolotoč.
Mazání na serveru je ve výchozím stavu vypnuté. Hlídání běží na pozadí bez potvrzování a smazaný soubor je nevratná věc, takže tohle rozhodnutí má padnout vědomě. Když ho zapnete, smazané položky jdou do koše na serveru — pokud ho má relace zapnutý; jinak zmizí nenávratně a aplikace na to před spuštěním upozorní.
Že něco běží na pozadí, je vidět ve stavovém řádku i v samotném dialogu, včetně počtu nahraných souborů a poslední akce.
Porovná lokální a vzdálený strom a nejdřív ukáže seznam akcí — teprve po potvrzení se cokoliv přenese. Směr může být jednosměrný i obousměrný, porovnávat lze podle času, velikosti nebo obojího. Mazání je volitelné a před provedením se na něj aplikace ještě jednou zeptá.
Směr, kritérium, maska i mazání se pamatují u relace — naklikává se pořád totéž, tak proč pokaždé znovu. Ukládá se při porovnání a platí jen pro uložené relace; u jednorázového připojení není kam. Cesty se nepamatují schválně: ty určují panely, ve kterých zrovna stojíte, a předvyplnit je odjinud by znamenalo synchronizovat něco jiného, než na co se díváte.
Aby opakovaná synchronizace nehlásila pořád tytéž soubory, přenáší se i čas
změny — přes SETSTAT u SFTP a MFMT u FTP.
U FTP je kolem času několik nástrah, které aplikace řeší za vás:
- Textový výpis (
LIST) hlásí čas jen na minuty, bez sekund a bez časové zóny. Pro zobrazení se parsuje, ale pro porovnávání se čas nechá upřesnit příkazemMDTM, který vrací UTC na sekundu. Proto porovnání trvá u FTP déle než výpis. - Tolerance je u FTP 61 s (u SFTP 2 s), aby minutová přesnost nezpůsobovala falešné rozdíly.
- Když server neumí
MFMT, nahraný soubor dostane čas „teď". Přenos kvůli tomu neselže, ale opakovaná synchronizace by pak soubory hlásila znovu — v takovém případě přepněte porovnávání na velikost.
Na zkoušení bez zásahu do skutečných serverů:
npm run serversSpustí dva servery na localhostu — jeden SFTP a jeden FTP, protože se každý chová jinak (FTP nemá shell, hlásí čas jen na minuty, neumí změnu vlastníka):
| Adresa | Přihlášení | Data | |
|---|---|---|---|
| SFTP | 127.0.0.1:2222 |
test / test |
test-data/sftp/ |
| FTP | 127.0.0.1:2121 |
test / test |
test-data/ftp/ |
Vzdálený adresář je /www, obsah zůstává mezi spuštěními. V Charonovi jsou
připravené relace Test SFTP (localhost) a Test FTP (localhost) ve složce
Testovací. Servery poslouchají jen na 127.0.0.1.
Při prvním připojení k SFTP se objeví dialog s otiskem klíče — je to ten
z test/fixtures/host_key, takže ho můžete potvrdit.
npm testtest/winscp-import.test.js— dekódování hesel WinSCP, parsování.inii.regtest/mask.test.js— zápis masek souborůtest/theme.test.js— světlý a tmavý motiv: že se barvy píšou jen v paletě, že má každá obě podoby a že volba přebije systém v obou směrechtest/filekind.test.js— rozpoznání typu souboru. Hlídá hlavně případy, kde přípona mate, a to, že každá škatulka má nakreslenou ikonu — bez pravidla ve stylu by položka dostala výchozí ikonu a nikdo by si toho nevšimltest/eta.test.js— odhad zbývajícího času proti skutečnému přenosu se známou rychlostí; ověřuje se i to, že na pauze a při stojícím přenosu odhad zmizí místo aby zamrzl na poslední hodnotětest/uploadperms.test.js— práva nahraných souborů. Kontroluje se, co má soubor na druhé straně, ne že jsme zavolali chmod; a že přenos nepadá, když server chmod neumítest/sshconfig.test.js— čtení~/.ssh/config. Hlavně pravidlo „první hodnota vyhrává", vzory,ProxyJumpaIncludevčetně kruhového odkazutest/listcache.test.js— paměť výpisů: platnost, zahazování a to, že se nezahodí zrovna složka, kterou člověk právě používátest/siteprofile.test.js— nastavení synchronizace uložené u relace; hlavně že ho nesmaže úprava relacetest/syncmodes.test.js— režimy synchronizace. Testuje se hlavně to, co se přenést nesmí: „jen novější" nesmí přepsat čerstvější soubor na cíli a „jen srovnat časy" nesmí sáhnout na obsah ani nic smazattest/queueorder.test.js— řazení fronty a pozastavení jedné položky; hlavně že ji společné „Pokračovat" nerozeběhnetest/ftpquirks.test.js— kódování názvů a časový posun proti skutečnému FTP serveru, včetně toho, že se posun netýká času zMDTM(ten je v UTC)test/rename.test.js— plán hromadného přejmenování: kolize, prázdné názvy a pořadí kroků, ve kterém se nic nepřepíšetest/terminal.test.js— uzavírání cesty do apostrofů. Ověřuje skutečný/bin/sh, že ze složky'; touch OVLADNUTOvznikne argument, ne příkaztest/eol.test.js— převod konců řádků, hlavně na hranicích mezi kusy dat: když jeden skončíCRa další začneLF, patří k sobě. Testuje se i po jednotlivých bajtechtest/textmode.test.js— textový režim při skutečném přenosu: že se použije jen na masku, že se u něj nenavazuje a že binární soubor přežijetest/backup.test.js— záloha před přepsáním; hlavně že selhání zálohy nezastaví přenos a že u nového souboru není co zálohovattest/queuedone.test.js— akce po dokončení fronty. Testuje se hlavně, kdy se hlásit nemá: po prázdném kliknutí a na pauzetest/fileops.test.js— kopie, odkaz a ruční čas proti skutečnému serveru, včetně záskoku, když shell cestu nevidítest/network.test.js— keepalive, timeouty a anonymní přihlášení; nula musí opravdu vypínat, ne se spolknout jako „nezadáno"test/urlsession.test.js— adresa relace tam i zpět; hlavně že se heslo nikdy nedostane do adresy ke zkopírovánítest/profiles.test.js— profily přenosu. Podstatné je, že profil nemění nastavení aplikace — jinak by se jednorázová odchylka stala trvaloutest/sessionlog.test.js— záznam komunikace: že v něm je, co má být, a že v něm není heslotest/segmented.test.js— přenos víc spojeními. Skládat soubor z kusů je nejrychlejší způsob, jak ho tiše poškodit, takže se všechno kontroluje otiskem proti zdroji — a hlavně se ověřuje, co se stane, když jeden úsek selže nebo když spojení navíc nejsoutest/version.test.js— porovnávání verzí. Textově by1.10.0vyšlo starší než1.9.0a beta by se vnucovala uživateli finální verzetest/dialogs.test.js— stavba dialogů: že lišta tlačítek je uvnitř formuláře. Tlačítko mimo něj vypadá stejně a nedělá vůbec nictest/session.test.js— správce záložek: pořadí, přepínání a úklidtest/editconflict.test.js— detekce cizí změny při ukládání z editorutest/properties.test.js— rekurzivní práva a kontrolní součty proti skutečnémusha256sumtest/queue-store.test.js— co z fronty přežije zavření aplikace a co netest/netpath.test.js— proxy a SSH brána proti skutečné proxy (napsané v testu podle RFC) a skutečné bráně. Hlídá se hlavně to, že se bez ověřeného klíče brána neotevře — bez toho by tunel nechránil před ničímtest/reconnect.test.js— obnovení spojení proti serveru, který se opravdu vypne a zase zapne. Ověřuje se i to, na co se nesmí reagovat: vlastní zavření záložky se neobnovuje a dva pokusy naráz se nepřekrývajítest/commands.test.js— doplňování šablon a spouštění příkazů. Uzavírání do apostrofů se ověřuje i doopravdy: soubor pojmenovanýa; touch HACKEDse přečte jako soubor a nic navíc nevzniknetest/safety.test.js— otisky klíčů aknown_hosts, odmítnutí neověřeného serveru, všechny volby při konfliktu, přesun a chování košetest/browse.test.js— dopočítání velikosti složek a hledání souborůtest/transfer-mask.test.js— masky u přenosů a synchronizace, včetně toho, že vyloučená složka neprojde ani jako ručně vybraný kořentest/tempname.test.js— přenos přes dočasný název; hlavně to, že cílový soubor zůstane během přenosu nedotčenýtest/watcher.test.js— hlídání složky. U automatiky je stejně důležité, na co nereaguje: bez výslovného zapnutí nesmí nic smazat a rozepsané soubory nesmí nahrávat dokolatest/parallel.test.js— souběžné přenosy, zásoba spojení a omezení rychlosti. Rychlost se měří proti hodinkám, ne proti počítadlu omezovače; zrychlení souběžností se ověřuje proti serveru s umělou latencí, protože na loopbacku by se neprojevilotest/e2e.test.js— SFTP: přenosy, pauza, navázání, chmod a synchronizace proti dočasnému SFTP serveru ztest/sftp-server.jstest/ftp.test.js— FTP: totéž proti dočasnému FTP serveru, včetně navázání přesREST/APPEa parsování časů z textového výpisutest/ftps.test.js— FTPS: potvrzování otisku certifikátu a hlavně kontrola, že se při nepotvrzeném certifikátu heslo na server vůbec neodešle
Testovací SSH klíč a certifikáty pro servery si testy vyrábějí samy
(test/fixtures.js, přes systémové ssh-keygen a openssl) a odkládají je
do dočasné složky. V repozitáři žádný privátní klíč není: i když by šlo o klíč
k serveru na 127.0.0.1, který žije jen po dobu jednoho testu, hlídače
tajemství to hlásí, lidi to mate a jednou by se podle toho vzoru uložil klíč,
na kterém záleží. Vyrobení stojí kolem desetiny vteřiny a příště se použije
znovu; smazat je jde kdykoliv, udělají se nové.
MIT, viz LICENSE. Dělejte si s tím, co chcete; záruka žádná.