I have set up automatic (password less) ssh login to some servers using ssh-copy-id. ssh-agent works only from the terminal where it was run. How do I get ssh-add to work in all my terminals?

Naturally, I would not prefer SSH key without a passphrase.


If you're logging into a graphical session, arrange to start ssh-agent during your session startup. Some distributions already do that for you. If yours doesn't, arrange to run ssh-agent from your session startup script or from your window manager. How do do that depends on your desktop environment and your window manager. For example, if you start your window manager manually, simply replace the call to my_favorite_wm by ssh-agent my_favorite_wm.

Do not start ssh-agent from .bashrc or .zshrc, since these files are executed by each new interactive shell. The place to start ssh-agent is in a session startup file such as .profile or .xsession.

If you want to use the same SSH agent on all processes no matter where you logged in from, you can make it always use the same socket name, instead of using a randomly-named socket. For example, you might put this in your ~/.profile:

export SSH_AUTH_SOCK=~/.ssh/ssh-agent.$HOSTNAME.sock
ssh-add -l 2>/dev/null >/dev/null
if [ $? -ge 2 ]; then
  ssh-agent -a "$SSH_AUTH_SOCK" >/dev/null
| improve this answer | |
  • 1
    FYI, the reason it checks for $? -ge 2 is because exit code 1 is when the ssh-agent has no keys, but ssh-agent is already running. – wisbucky Aug 9 '19 at 23:00
  • Note that some desktop environments (e.g. Ubuntu Mate) may automatically run ssh-agent for you but you have to run ssh-add without parameters to add private keys into your keyring. For example, when you first connect to remote machine that contains private keys, you have to run ssh-add on the remote matchine to get the keys into your client machine keyring. – Mikko Rantalainen Mar 21 at 9:51
  • I am curious, when it's possible to set this up in a few lines of a shell script, what is the purpose of keychain, ssh-ident or other projects. – Pavel Šimerda Apr 12 at 10:29
  • FYI, if you have a .bashrc file, you have to put theses lines instead of .profile (see head ~/.profile for explanations) – Asenar Nov 10 at 10:01
  • @Asenar No. .profile is the right file for what runs at login time. .bashrc runs every time you open a terminal. See superuser.com/questions/183870/… – Gilles 'SO- stop being evil' Nov 10 at 10:50

You probably want a program such as Keychain, which was designed for this exact purpose. From the man page:

   keychain is a manager for ssh-agent, typically run from ~/.bash_profile.
   It allows your shells and cron jobs to share a single ssh-agent process.
| improve this answer | |
  • really like this one! – Colin D May 11 '17 at 14:45
  • Great! thank you. Works perfectly. – Somebody May 7 '19 at 16:22
  • this works great, after downloading the compressed file from Github, make sure you add the complete path of uncompressed keychain-2.8.5 directory to your ~/.bash_profile export PATH=$PATH: line – Kevin Zhao Aug 16 '19 at 23:57
  • What is the advantage of keychain over the the accepted answer? – Pavel Šimerda Apr 12 at 10:31

Apply it to your desktop environment or window manager. When I've done this manually in the past with a custom ~/.Xclients, I just used this as the last line:

ssh-agent mywindowmanger

There might be some DE's that have their own setup options for this, although it appears to me that (e.g.) KDE does not. Currently, it seems that mine was run via code from /etc/X11/xinit/xinitrc-common (presumably something done by fedora), since it is active for all users regardless of DE/WM and the parent process command is $HOME/.Xclients, but that file does not reference ssh-agent (whereas /etc/X11/xinit/xinitrc-common does).

If you don't have a ~/.Xclients, you could create one with just that one line, but you will need to know the command that starts your DE/WM.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.