39

I recently setup openssh so I could use it with git.

In the process of setting it up (as per this article) I ran the commands:

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/<name of key>

Some time later, after I logged out and back in I tried to use git push I got an error. The solution to this error was running those same commands again.

Please tell me how I can

  • Keep the ssh-agent running so I don't have to start a new one
  • Remember the keys I've added so I don't have to add them everytime

Just to clarify, I use zsh so certain bash features won't work in my .zshrc.

timotree
  • 1,078
  • 1
  • 9
  • 22

2 Answers2

43

What is ssh-agent for and how does it work?

The ssh-agent keeps your decrypted keys securely in memory and in your session. There is no reasonable and safe way to preserve the decrypted keys among reboots/re-logins.

OK, how can I automate it?

Automate ssh-agent startup

Add

[ -z "$SSH_AUTH_SOCK" ] && eval "$(ssh-agent -s)"

to your ~/.bashrc or other startup script (~/.zshrc).

Automate adding the keys

The keys can be automatically added upon the first usage, when you add

AddKeysToAgent yes

to your ~/.ssh/config.

For more information on ~/.ssh/config see man ssh_config.

Jakuje
  • 10,032
  • 5
  • 33
  • 34
  • So you're saying if I enable AddKeysToAgent, then whenever I type `eval "$(ssh-agent -s)"` it will add my key? – timotree Dec 04 '16 at 19:27
  • If the agent is running and your `ssh` supports this option, then yes. – Jakuje Dec 04 '16 at 19:28
  • Can you please clarify how I would automate starting the `ssh-agent` then? – timotree Dec 04 '16 at 19:30
  • Basically, as explained in the other answer. `[ -z "$SSH_AUTH_SOCK" ] && eval $(ssh-agent)` – Jakuje Dec 04 '16 at 19:31
  • Does that work with zsh? – timotree Dec 04 '16 at 19:32
  • Yes, but in that case, it is not `~/.bashrc`, but `~/.zshrc` or similar file. – Jakuje Dec 04 '16 at 19:33
  • Let us [continue this discussion in chat](http://chat.stackexchange.com/rooms/49566/discussion-between-timotree-and-jakuje). – timotree Dec 04 '16 at 19:51
  • 1
    On Ubuntu 19.10, I ended up with *two* instances of `ssh-agent`, as it appears to come preinstalled (?) - you can check with `ps -e | grep 'ssh'` to see if it's running. I only needed to add the the `AddKeysToAgent yes` setting to `.ssh/config` to make added keys persist between reboots. – mindplay.dk Feb 07 '20 at 13:46
  • I suggest redirecting the output to `/dev/null`, otherwise the `ssh-agent` will print the pid when login, which might cause failing using `rsync`. See https://serverfault.com/a/328404/576442. You can use `[ -z "$SSH_AUTH_SOCK" ] && eval "$(ssh-agent -s)" > /dev/null 2>&1` – huangbiubiu May 27 '20 at 15:01
11

Add this to ~/.bashrc

This means ssh-agent will be started automatically when you open another session no your terminal

if [ -z "$SSH_AUTH_SOCK" ] ; then
 eval `ssh-agent -s`
fi

if you need a key to be added to the agent also add this

if [ -z "$SSH_AUTH_SOCK" ] ; then
 eval `ssh-agent -s`
 ssh-add ~/.ssh/<your private ssh key>
fi
trm
  • 103
  • 3
Savitoj Singh
  • 181
  • 1
  • 3