0
SSH offers several forms of authentication, such as passwords and
public keys. The latter are considered more secure. However, password
authentication remains prevalent, particularly with network equipment.
A classic solution to avoid typing a password for each connection is
sshpass, or its more correct variant passh. Here is a wrapper for Zsh,
getting the password from pass, a simple password manager:
pssh() {
passh -p <(pass show network/ssh/password | head -1) ssh "$@"
}
compdef pssh=ssh
This approach is a bit brittle as it requires to parse the output of the ssh
command to look for a password prompt. Moreover, if no password is required, the
password manager is still invoked. Since OpenSSH 8.4, we can use
SSH_ASKPASS
and SSH_ASKPASS_REQUIRE
instead:
ssh() {
set -o localoptions -o localtraps
local passname=network/ssh/password
local helper=$(mktemp)
trap "command rm -f $helper" EXIT INT
> $helper <<EOF
#!$SHELL
pass show $passname | head -1
EOF
chmod u+x $helper
SSH_ASKPASS=$helper SSH_ASKPASS_REQUIRE=force command ssh "$@"
}
If the password is incorrect, we can display a prompt on the Continue reading