Non-interactive SSH sessions
If you don't need to have an interactive session on the remote server, you can execute ssh in an environment without tty, e.g. as part of a Run Shell Script action in Automator.
You need to create a program that when called prints the password to standard out, e.g. the following bash script you need to make executable using chmod +x pwd.sh:
#!/usr/bin/env bash
echo "password"
Then, set the SSH_ASKPASS environment variable to the path to this program, and then run ssh in the Automator action, like this:
export SSH_ASKPASS=/Users/danielbeck/pwd.sh
ssh user@hostname ls
When there is no tty, but SSH_ASKPASS and DISPLAY (for X11, set by default) are set, SSH executes the program specified by SSH_ASKPASS and uses its output as password. This is intended to be used in graphical environments, so that a window can pop up asking for your password. In this case, we just skipped the window, returning the password from our program. You can use security to read from your keychain instead, like this:
#!/usr/bin/env bash
security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2
ls (on the ssh command line) is the command executed when ssh has logged in, and its output is printed in Automator. You can, of course, redirect it to a file to log output of the program you start.
Interactive SSH sessions using sshpass
I downloaded, compiled and installed sshpass and it worked perfectly. Here's what I did:
- Get the Apple developer tools
- Download and open
sshpass-1.05.tar.gz
- Open a shell to the directory
sshpass-1.05
- Run
./configure
- Run
make
- Run
make install (you might need sudo for it)
Now the program is installed to /usr/local/bin/sshpass. Execute using a line like the following:
sshpass -pYourPassword ssh username@hostname
You can read the password from security just before doing that, and use it like this:
SSHPASSWORD=$( security find-generic-password -l password-item-label -g 2>&1 1>/dev/null | cut -d'"' -f2 )
sshpass -p"$SSHPASSWORD" ssh username@hostname
Wrap this in a shell function and you can just type e.g. ssh-yourhostname to connect, having it retrieve and enter the password automatically.
STDIN is not a terminal. 2) For interactive sessions withsshpass, the-poption apparently doesn't do anything. But runningsshpasswhileSSH_ASKPASSis set does work! – Chaitanya Gupta Feb 28 '12 at 04:34STDIN is not a terminalerror. However, I wasn't prompted for any password this time; I do believeSSH_ASKPASSis working in the Automator since, if I make the file inSSH_ASKPASSreturn the wrong password, I get aPermission denied, please try again.error. – Chaitanya Gupta Feb 28 '12 at 08:40macOs >= 10.13– nbari May 22 '18 at 15:47securityutility is now a bit out of date. The-woption will just return the password directly. So you can replace all of-g 2>&1 1>/dev/null | cut -d'"' -f2with-w. Here's the full example using this:
– Chris Mar 04 '19 at 02:08SSHPASSWORD=$( security find-generic-password -l password-item-label -w );sshpass -p"$SSHPASSWORD" ssh username@hostnameSSH_ASKPASSsolutions seem to place the password in the arguments, which is not secure. See this: https://stackoverflow.com/questions/6607675/shell-script-password-security-of-command-line-parameters – Robert Quattlebaum Mar 02 '21 at 19:25