Az alábbi okosság a következő esetekben jöhet jól:
- Valami miatt több SSH kapcsolatot szeretnénk nyitni egy hosztra egyszerre (akár mert több dolgot csinálnánk a gépen mi magunk párhuzamosan, akár mert valami automatizált folyamatnak/szkriptnek kell indítgatnia több lekérdezést a másik hoszton SSH-n pl.).
- Nagy a hálózati késleltetés a gépünk és a cél hoszt közt.
- Legfőképp pedig, ha az előző kettő eset egyszerre áll fenn.
Van egy “session multiplexing” működési módja az SSH kapcsolódásnak (feltéve, ha a használt kliens ezt a funkciót támogatja, erről bővebb infó egy mátrixban itt – én most itt az OpenSSH-val való használatot írom le), hogy az első SSH kapcsolat létrejötte után, a kliens létrehoz egy “Unix socket leíró” fájlt, kinevezi a kapcsolatot “master”-nek, és innentől fogva bármely további SSH kapcsolat nyitás esetén nem fog új, külön TCP kapcsolatot nyitni a kliens mindegy egyes új SSH kapcsolatnak, hanem a socketet használva a master kapcsolaton keresztül fog menni az összes SSH kapcsolat adatfolyama az adott hosztra. Ez a gyakorlatban azt jelenti, hogy az első kapcsolat létrejötte után, a többi már nem kíván sem új TCP kapcsolat felépítést, sem autentikációt.
A dolog beállítása úgy megy, hogy létrehozunk (ha még nem lenne) egy ~/.ssh/config fájlt és beleírjuk ezt a pár sort:
Host *
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/cm_socket/%r@%h:%p
Az első sorral létrehozunk egy “hoszt sztanzát” (definiálunk egy hosztot, vagy többet, amire az utána lévő beállítások vonatkozni fognak), esetünkben minden hosztra vonatkoztatjuk a beállítást. Második sorban bekapcsoljuk a ControlMaster funkciót, amiről a bejegyzés szól. Ennek értéke lehet még autoask, melynek esetén a kapcsolat nyitáskor a kliens megkérdezni, hogy szeretnénk-e használni a már élő, master kapcsolatot, illetve no, amivel értelemszerűen kikapcsoljuk. A harmadik sorban a ControlPersist bekapcsolásával azt állítjuk be, hogy ha a mindenkori master kapcsolat megszakad, és még van egy, vagy több másik SSH munkafolyamat, akkor valamelyik automatikusan átvegye a master szerepét. Ugyanezzel az opcióval lehetőség van megadni “IdleTimeout” időt is, másodpercben. Ez esetben nem marad életben a master “örökre”, ha nincs rajta forgalom, csak míg a megadott idő le nem jár. Negyedik sorban a ControlPath-szal kell megadni, hogy a kliens hol hozza létre a multiplexinghez szükséges “Unix socket leíró” fájlt. (Ennek az útvonala, ha nem létezik, hozzuk létre kézzel.) És ennyi.
Ha olyan egyedi eset áll fenn, mikor mégsem szeretnénk használni a ControlMastert, a “-S none”, vagy a “-o ControlMaster=no” kapcsolóval ki lehet kapcsolni az aktuális kapcsolódásnál.
Vannak azonban esetek, amikor egyáltalán nem javasolt a használat:
- Túl nagy adatmennyiség mozgatásakor (pl. 20-30 konkurrens rsync-es másolás), lévén egyetlen csövön szeretnénk túl sok mindent átnyomni.
- Tunneling esetén. Szintén beállíthatjuk a config fájlban, hogy az ilyen kapcsolatoknál ne használja a multiplexinget:
[tunnels]
ssh = ssh -o ControlMaster=no