Limit czasu klucza ssh-agent z screenem lub tmuxem na hoście bastionu

8

Zwykle mam uruchomionego agenta ssh, ssh do hosta bastionu, następnie otwieram sesję tmux i łączę się z innymi urządzeniami przez to. Przekazywanie kluczy działa dla wszystkich sesji, które otwieram od tego momentu.

Jeśli wznowię sesję tmux po zamknięciu terminalu, spanie laptopa, cokolwiek, moje przekazywanie kluczy w moich sesjach bastionu nadal działa, podobnie jak przekazywanie w przypadku nowych sesji. Istniejące jednak nie działają.

Mam trochę rzeczy w moim bashrc, które kontynuują przekazywanie kluczy, kiedy wznawiam tmux, ale mam problem z ustaleniem, jak to zrobić, aby działało dla sesji otwartych w tmux.

Na przykład mam bastion01, dbhost01, dbhost02, webhost01 i webhost02.

Jeśli otworzę połączenie z bastion01, uruchom tam tmux, a następnie połącz z dbhost01 i działa przekazywanie webhost01. Jeśli zamknę to połączenie, ponownie połączę i dołączę moją istniejącą sesję tmux, a następnie dodam połączenia do dbhost02 i webhost02, przekazywanie kluczy działa na polach 02, ale nie na 01.

Proszę pomóż!

Jericon
źródło

Odpowiedzi:

11

Za każdym razem, gdy używasz ssh bastion01, otwierane jest inne gniazdo do obsługi przekazywania kluczy. Możesz zobaczyć nazwę pliku w zmiennej środowiskowej SSH_AUTH_SOCK. Kiedy zaczynasz tmux, wartość tej zmiennej środowiskowej jest uwzględniana w tmuxglobalnym środowisku, które jest dziedziczone przez wszelkie powłoki uruchomione w tej sesji.

Teraz, kiedy ponownie się bastion01połączysz, przydzielane jest inne gniazdo do obsługi przekazywania kluczy (ponieważ jest to nowa sesja ssh). Możesz to sprawdzić, sprawdzając wartość SSH_AUTH_SOCKprzed ponownym dołączeniem do tmuxsesji i po niej. Aby przekazywanie kluczy działało w środku tmux, musisz zaktualizować wartość SSH_AUTH_SOCKinside tmuxdo nazwy gniazda używanego przez bieżącą sesję ssh.

Szybkim i brudnym sposobem na to jest napisanie krótkiego skryptu, który zapisze tę nową wartość w pliku, i uruchom go w dowolnym tmuxoknie, z którego będziesz korzystać ssh.

#!/bin/bash

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.auth_ssh

Wykonaj ten skrypt jak najszybciej po ssh bastion01, ale zanim ponownie przyłączysz się do sesji tmux. Następnie, zanim spróbujesz ssh gdziekolwiek od wewnątrz tmux, uruchom następujące polecenie:

source ~/.auth_ssh

Każde tmuxokno ma swoje własne środowisko, więc musisz je uruchomić w każdym oknie, w którym próbujesz uruchomić ssh. Dla uproszczenia możesz użyć aliasu ssh, aby zrobić to za Ciebie:

alias ssh="source ~/.auth_ssh; ssh"

Uwaga: jest to rażące uproszczenie skryptu, którego używamy w pracy do aktualizacji informacji autoryzacyjnych SSH. Jeśli to nie działa poprawnie, mam nadzieję, że przynajmniej dostarczy ci wystarczających informacji, aby znaleźć lepsze rozwiązanie w Google (lub ktoś inny opublikuje tutaj lepsze rozwiązanie).

chepner
źródło