How to make ssh-add read passphrase from a file?

ssh, ssh-agent

Solution

Depending on your distribution and on the version of ssh-add you may be able or not to use the `-p` option of ssh-add that reads the passphrase from stdin in this way:

cat passfile | ssh-add -p keyfile

If this is not working you can use Expect, a Unix tool to make interactive applications non-interactive. You'll have to install it from your package manager.

I have written a tool for you in expect. Just copy the content in a file named ssh-add-pass and set executable permissions on it (`chmod +x ssh-add-pass`). You can also copy it to /usr/bin or /usr/local/bin to be accessible from the $PATH search.

#!/bin/bash

if [ $# -ne 2 ] ; then
  echo "Usage: ssh-add-pass keyfile passfile"
  exit 1
fi

eval $(ssh-agent)
pass=$(cat $2)

expect << EOF
  spawn ssh-add $1
  expect "Enter passphrase"
  send "$pass\r"
  expect eof
EOF

The usage is simply: `ssh-add-pass keyfile passfile`

Problem

I am trying to add a key to `ssh-agent` and want `ssh-add` to read the password from the key file I'm using. How is this possible? How do I automate this process from the shell script?

Original source

Related problems