A tmux és az ssh újracsatlakozás után is működő SSH Agent-forwarding

Egy borítóképnek nem feltétlen kell köze legyen a témához

Újabban ismét többet használok Unixokat, most leggyakrabban Linuxot. Elengedhetetlen társam ebben a tmux terminál multiplexer. Gyakran használom bonyolultabb munkamenetek átlátásához, illetve arra, hogy hosszan futó feladatok egy hálózati problémát is túléljenek.

Amikor megbízható gépekhez csatlakozom, akkor az SSH Agent Forwardingot is használom, mert hasznos, és kényelmes funkció. Persze tisztában kell lenni a biztonsági kockázataival, és azt figyelembe véve szabad csak használni.

Amikor azonban egy új ssh kapcsolattal csatlakozunk egy géphez, és a tmux munkamenethez ismét csatlakozunk, azt vehetjük észre, hogy már nem működik az SSH Agent Forwarding. Ez azért van, mert az új kapcsolat új agent socketet csinált, amin keresztül a távoli ssh a helyi ssh agenttel tud kommunikálni, és a környezetben a korábbi socket elérése található.

Az interneten szétnézve találni erre megoldásokat, amik legtöbbször egy fix helyre symlinkelik a legutolsónak csatlakozó kapcsolat ssh socketjét. Én ezek alapján egy hasonló, de kicsit a saját szájam ízéhez igazított megoldást választottam.

A tmux frissítse a tárolt környezeti változót újrakapcsolódáskor

A tmux támogatja, hogy a környezeti változóit frissítse egy már futó session-nek, így az újonnan nyíló ablakokban induló új shellek már az aktuális értéket kapják.

Ehhez csupán a következőt kell a ~/.tmux.conf fileba írni:

set-option -g update-environment "SSH_AUTH_SOCK \
                                  SSH_CONNECTION"

Ezzel azonban a korábban nyitott shellekből nem fog még működni az agent forwarding, ami kissé kellemetlen.

Futó shellek környezeti változóinak frissítése

Mivel most linuxon tevékenykedek, ezért meg se próbálok úgy tenni, mintha érdekelne a POSIX-kompatibilitás. Inkább valami életszerűbbet, egy Bash shellhez való megoldást mutatok.

A ~/.bashrc fileban a következő függvényt kell létrehozni:

function refresh-env-vars()
{
    if [ -n "$TMUX" ];
    then
        while read env_line;
        do
                eval "$env_line";
        done < <(tmux show-environment -s)
    fi
}

A tmux show-environment -s parancs Bourne shell parancsok formájában soronként kiírja az általa kezelt környezeti változókat, amiket a set-environment, és a korábban látott update-environment parancsaival lehet manipulálni. Ezeket a sorokat az eval segítségével a shell kontextusában lefuttatva frissültek is a megfelelő változók.

💡 Fontos a fent látható Process substitution formátumban kikérni a tmux-tól a parancsokat, mert amennyiben a szokásos parancs | while read ciklus formát használnánk, úgy a while már egy subshellben futna, így a változók értékadásai nem lennének hatással a környezetünkre!

Ezek után egy már futó környezetben csupán a refresh-env-vars parancsot kell hívni, és már működik is az agent forwarding!