]> arthur.barton.de Git - ax-zsh.git/blob - default_plugins/ssh/ssh.zshrc
ssh: Make sure that XDG_RUNTIME_DIR is set & valid
[ax-zsh.git] / default_plugins / ssh / ssh.zshrc
1 # AX-ZSH: Alex' Modular ZSH Configuration
2 # ssh.zshrc: Setup (Open-) SSH
3
4 # Make sure that "ssh(1)" is installed
5 (( $+commands[ssh] )) || return
6
7 # Load SSH keys into the SSH agent, when one is running and doesn't have
8 # any keys already. Not having an SSH agent running at all is ok as well and
9 # results in an "success" exit code (0) as well.
10 ssh-autoadd() {
11         [[ -z "$SSH_AUTH_SOCK" ]] && return 0
12         ssh-add -l >/dev/null && return 0
13         [[ $? -eq 2 ]] && return 2
14         ssh-add
15 }
16
17 _ax_ssh_prompt() {
18         [[ -n "$SSH_CLIENT" ]] || return 1
19         return 0
20 }
21
22 ax_logname_prompt_functions=($ax_logname_prompt_functions _ax_ssh_prompt)
23 ax_hostname_prompt_functions=($ax_hostname_prompt_functions _ax_ssh_prompt)
24
25 # Validate SSH_AUTH_SOCK: Inside of screen(1) sessions for example, the socket
26 # file becomes invalid when the session has been disconnected.
27 [[ ! -r "$SSH_AUTH_SOCK" ]] && unset SSH_AUTH_SOCK
28
29 # Save SSH environment when available:
30 if [[ -n "$SSH_AUTH_SOCK" && -d "$XDG_RUNTIME_DIR" ]]; then
31         # Save current environment when no state exists or is invalid.
32         if [[ -r "$XDG_RUNTIME_DIR/ssh-env.sh" ]]; then
33                 (
34                         source "$XDG_RUNTIME_DIR/ssh-env.sh"
35                         if [[ -z "$SSH_AUTH_SOCK" || ! -r "$SSH_AUTH_SOCK" ]]; then
36                                 # Content is invalid, remove state file!
37                                 rm -f "$XDG_RUNTIME_DIR/ssh-env.sh"
38                         fi
39                 )
40         fi
41         if [[ ! -r "$XDG_RUNTIME_DIR/ssh-env.sh" ]]; then
42                 # No state file exists, create a new one:
43                 echo "SSH_AUTH_SOCK=\"$SSH_AUTH_SOCK\"" >"$XDG_RUNTIME_DIR/ssh-env.sh"
44                 echo "export SSH_AUTH_SOCK" >>"$XDG_RUNTIME_DIR/ssh-env.sh"
45         fi
46 fi
47
48 # Restore SSH environment when not set but available:
49 if [[ -z "$SSH_AUTH_SOCK" && -r "$XDG_RUNTIME_DIR/ssh-env.sh" ]]; then
50         # Try to recover known good environment ...
51         source "$XDG_RUNTIME_DIR/ssh-env.sh"
52         if [[ ! -r "$SSH_AUTH_SOCK" ]]; then
53                 # Clean up!
54                 unset SSH_AUTH_SOCK
55                 rm -f "$XDG_RUNTIME_DIR/ssh-env.sh"
56         fi
57 fi