Chciałbym automatycznie uruchamiać polecenie za każdym razem, gdy pomyślnie połączę się ze zdalnym hostem przez ssh.
Mogę to zrobić dla pierwszego połączenia z każdym hostem przy użyciu wpisów PermitLocalCommand yes
i LocalCommand ~/bin/ssh-notify-me
w mojej ~/.ssh/config
, podobnie jak w tej odpowiedzi, ale używam również dość agresywnej konfiguracji multipleksowania ssh (w przybliżeniu następujące):
Host *
PermitLocalCommand yes
ServerAliveCountMax 2
ServerAliveInterval 5
ControlPath ~/.ssh/mux/%r@%h:%p
ControlMaster auto
ControlPersist 1h
Przy tej konfiguracji LocalCommand jest wykonywany tylko dla pierwszego połączenia, zanim istnieje gniazdo kontrolne master / mux. Następnie łączę się, ale polecenie nie działa.
Czy jest jakiś sposób (bez wyłączania multipleksera), aby upewnić się, że LocalCommand lub jakiś równoważny wystąpi dla każdej nowej otwartej sesji interaktywnej?
Zawijanie ssh
pliku binarnego w funkcji powłoki lub skrypcie wydaje się, że nie zadziałałoby, ponieważ nie może wiedzieć, czy połączenie zakończyło się powodzeniem, dopóki nie zostanie zakończone.
ssh foo
i ssh foo -t <cmd>
, ale nie scp / cokolwiek innego, co nie ma przydzielonego pty. Edytowane pytanie do wyjaśnienia.
automatically run a command every time I successfully connect
- I dokładnie tak się dzieje. man 5 ssh_config
mówi o ControlMaster
: Enables the sharing of multiple sessions over a single network connection
. Jest tylko jedno połączenie. Proces główny ssh
go tworzy (łączy), ssh
używa go każdy kolejny . Rozumiem, co chcesz osiągnąć; Chodzi mi o to, że używasz słowa „połączenie”, gdzie „sesja” jest tym, co masz na myśli.