44

I need to run ssh-add <key> everytime I need to ssh into a webserver. Is there a way to add the ID permanently, so I dont have to keep adding the identities on each login?

EDIT: The key is a pem file, that I have downloaded from a cloud service.

8 Answers 8

42

Generate your key like normal: ssh-keygen, then place that key to the remote server with ssh-copy-id, which will sync it to the remote server's accepted keys.

ssh-keygen
ssh-copy-id user@host

It will prompt for your password then perform all the steps necessary to link your .pub key with the remote SSH server.

By default it will copy all your .pub keys to the remote server. If you just created your key with ssh-keygen then this isn't a problem (because you only have one!). However, if you have multiple keys you can copy just a specific key with the -i flag.

ssh-copy-id -i ~.ssh/key_name.pub user@host

Replacing key_name.pub with the name of the key.

3
  • 4
    For someone like me (or the question asker) whose only exposure to ssh is using it to access cloud-hosted servers where the web service creates the key and gives it to me (in my case, AWS servers), this answer is hard to understand without doing some significant background research. I've never used ssh-keygen or ssh-copy-id, for example. On the other hand, answers like this one are perfectly clear and useful to me given my level of knowledge. Up to you whether you want to tweak your answer in any way to help ignorant people like me. :)
    – Mark Amery
    Jan 14, 2014 at 15:08
  • 1
    The answer assumes that I want to generate a new key. What if I want to simply register an existing key with the keyring?
    – donquixote
    Jan 15, 2019 at 16:24
  • @donquixote: see the answer below by user626052.
    – naught101
    Mar 9, 2019 at 0:00
16

put this in your ~/.bashrc

eval $(ssh-agent)
ssh-add ~/.ssh/where_ever_privake_key_is 
4
  • 4
    This is the only answer that actual answers the question. The others are just adding the default public key to a single target server, which is annoying if you have two+ separate for different sets of servers.
    – naught101
    Mar 8, 2019 at 23:44
  • Thanks for the right answer
    – Dan Ortega
    Feb 2, 2021 at 14:50
  • 3
    This solution adds ssh identity every time you open the terminal, this solution works, may not be the proper way, but you come out of the problem, thanks for the solution.
    – Rajath M S
    May 26, 2021 at 9:23
  • This solution prompts for the key passphrase every time .bashrc is ran (i.e. any time you open a terminal), which is very annoying and disruptive. I there a way to avoid this?
    – Neinstein
    Jan 19 at 8:12
7

You can generate a ssh key with the command:

ssh-keygen

Then you can copy your key to the server with:

ssh serveruser@servername "echo `cat ~/.ssh/id_dsa.pub` >> ~/.ssh/authorized_keys" 

Now you can automatically log in your webserver

1
  • 1
    To copy the key to ther server you can just use ssh-copy-id -i ~/.ssh/id_dsa.pub serveruser@servername or ~/.ssh/id_rsa.pub respectively. Actually, if you use the default name for the key file you do not even have to specify it. Jan 10, 2011 at 14:26
3

If your key is password-less and named as one of the files ssh will try to look for when identifying (~/.ssh/id_dsa or ~/.ssh/id_rsa), you shouldn't have to add it to your agent.

BUT. If there's the slightest possibility of those files being stolen, you would have just allowed anyone to access the servers on which you are using this identity. In short, pwned.

IMHO, password-less private keys are a bad practice, and should be used only on environments where ~/.ssh/authorized_keys is very restrictive.

1
  • 1
    ssh-agent can keep your decrypted private key, while you are logged in. If enabled, the gnome-keyring can even use your login password. Oh, and ssh-copy-id can copy your public key to servers, too.
    – Frank
    Jan 10, 2011 at 14:02
1

Write a short shell script which will run ssh-add and then connect such as the following:

ssh-add ~/.ssh/your-key
ssh user@remotehost

You can then ssh into your host with one command.

1

For AWS, download the pem key, and run:

ssh-add /path/to/pemfile.pem

That worked for me, ubuntu 18.04. Source, Nothing else was needed.

NB: However, it is important to set the permissions to 400 before doing this.

chmod 400 /path/to/pemfile.pem

If not you will get an error:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @
WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0664 for '/home/toing_toing/blablabla.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.

0
 ssh serveruser@servername "cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys" 
-3

Are you talking about Amazon Cloud? In your ~/.bashrc, create environment variables:

# Amazon
export EC2_PRIVATE_KEY=$HOME/Keys/pk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
export EC2_CERT=$HOME/Keys/cert-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.pem
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk/
2
  • yes, I talk about the cloud, but this is the key-pair to ssh into the instance, and the above environment variables are necessary to use the api-tools :) Jan 10, 2011 at 16:27
  • Ok. So generate an RSA key with no password: 'ssh-keygen -t rsa' and then concatenate the generated public key (~/.ssh/id_dsa.pub) to the remote server's ~/.ssh/authorized_keys file. A one-liner to accomplish this was given by many.
    – user8290
    Jan 10, 2011 at 17:45

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.