November 2021

S M T W T F S
 123456
78910111213
1415161718 1920
21222324252627
282930    

Page Summary

Style Credit

Expand Cut Tags

No cut tags

February 21st, 2020

filin: (Default)
Friday, February 21st, 2020 04:03 pm
По итогам обсуждения у Витуса (1 серия, 2 серия) собрал и причесал:

source_ssh_auth:
fix_ssh_auth_sock () {
    if [ -e "$HOME/bin/fixssh" ]; then /bin/rm -f "$HOME/bin/fixssh"; fi
    if [ -S "$SSH_AUTH_SOCK" -a ! -L "$SSH_AUTH_SOCK" ]; then
        local new_ssh_auth_sock_dir
        new_ssh_auth_sock_dir="$HOME/.ssh/auth_sock"
        local new_ssh_auth_sock
        new_ssh_auth_sock="$new_ssh_auth_sock_dir/auth_sock.$(hostname)"
        if [ ! -d "$new_ssh_auth_sock_dir" ]; then
            mkdir -p "$new_ssh_auth_sock_dir" || return
        fi
        ln -sf "$SSH_AUTH_SOCK" "$new_ssh_auth_sock" || return
        SSH_AUTH_SOCK="$new_ssh_auth_sock"
        export SSH_AUTH_SOCK
    fi
}

case "$DISPLAY" in
    # don't run fix_ssh_auth_sock if logged in locally in X
    # because otherwise you'll lose connection to local ssh agent
    # after first remote or terminal login to this host
    :*) ;;
    *) fix_ssh_auth_sock ;;
esac


Что делает. Если видит в переменной SSH_AUTH_SOCK сокет ssh-агента (но не симлинк на него — поэтому ! -L), делает на него симлинк с well-known именем. После чего переставляет переменную SSH_AUTH_SOCK.

Единственная переменная часть в имени — hostname. Защита от проблем, возникающих в случае с NFS-mounted home.

Что позволяет. Типичная ситуация: с хоста A, где агент, идем с форвардом агента на хост B, запускаем там screen или tmux, и оттуда ходим на хосты C, D и т.д. Если не выполнить fix_ssh_auth_sock, то после первого detach, по любой причине, $SSH_AUTH_SOCK внутри screen останется негодным навсегда. А он случайный. А если выполнить, то после перелогина и подсоединения к сессии он снова станет годным. Будет через симлинк указывать на новый сокет.

Запускается... Во-первых, не запускается, а читается. "." (source), в смысле. Потому что надо переставить переменную. У меня из .zprofile, а остальным рекомендуется .profile или .bash_profile. Синтаксис намеренно выдержан таким, чтобы можно было запускать даже из dash.

Не надо запускать это из НЕинтерактивного шелла — агент отвалится после завершения команды. Честно говоря, маны на bash и dash мутны в части того, выполняется ли .profile из логинного, но неинтерактивного шелла. Подозреваю, что нет, но экспериментируйте себе сами.

.zlogin:
if [ -n "$SSH_CONNECTION" ]; then exec screen -xRR; fi


Что делает. При интерактивном логине по ssh молча запускает screen в режиме «если есть запущенная сессия, подцепиться к ней (к самой свежей по времени создания, если их несколько), НЕ отцепляя других возможных клиентов той же сессии; если ее нет, создать и подцепиться». Согласно man screen, именно с этими ключами screen запускается, если указать его в качестве логинного шелла.

Что позволяет. Не попадать в ситуации, когда надо бы отцепиться от сервера (положить спать ноутбук, с которого зашли), а команда на сервере оказалась слишком долгоиграющей, и прерывать ее не хочется. Или в ситуации, когда и не стал бы отключаться, да канал упал, не спросив. Общий принцип: зашел на удаленную машину — запусти screen.

Запускать. У меня из вышеуказанного .zlogin. У кого .profile или .bash_profile, оттуда последней командой.
Tags:
OSZAR »