Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

I'm trying to create a shell script that, among other things, starts up ssh-agent and adds a private key to the agent. Example:

# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

The problem with this is ssh-agent apparently kicks off another instance of $SHELL (in my case, bash) and from the script's perspective it's executed everything and ssh-add and anything below it is never run.

How can I run ssh-agent from my shell script and keep it moving on down the list of commands?

share|improve this question

4 Answers 4

up vote 2 down vote accepted

ssh-agent is supposed to start a session and when it finishes the user session is over. So any command after ssh-agent would perhaps be executed after logoff.

What you want is a session-script that contains your sessions commands like this:

ssh-add /path/to/key
bash -i # or other session starter

Then start ssh-agent session-script.

share|improve this answer
Thanks! Creating a separate script and ending the script with exit did the trick. –  Dan Oct 23 '13 at 16:29

I tend to do something like this in scripts that require an agent.


# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"

... and so on.

Basically the first thing the script does it check to see if an agent is running. If it isn't exec is used to start a new process in place of the script. The agent is started, keys are added, and finally, the script is called again (see the $0).

share|improve this answer
But that will not preserve any script parameters. And if any of the parameters has whitespace, it won't be easy to pass them along. –  Denilson Sá Aug 7 '14 at 14:24
You could use .. "ssh-add ; $0 $*", or .. "ssh-add ; $0 $@" instead, which may work. Which wouldn't be perfect, but would certainly work in many cases. The best solution is almost always to have your agent running before anything else anyway, this is just something that might be useful in obscure cases. –  Zoredache Aug 7 '14 at 16:40

I've tried and lot and the solution that finally worked was replacing my passphrase with an empty string.

ssh-keygen -p
share|improve this answer

I found with Zoredache's solution, the key would be available to any shell that happens to share the same ssh-agent as the shell that called the script. I wanted to avoid this in a script that required root access to a remote machine, for obvious security reasons.

I've found putting the following shebang at the top of the script works:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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