Bash SSH Happiness
So Dennis? (whose name doesn’t appear anywhere on his blog except for in the URL) wrote a cool bash script to create aliases for every host in your ~/.ssh/known_hosts file. I found some bugs/problems so I spiffed it up a bit. As the comments say, you should pipe the output to sort(1). I’ve tried to make the text as small as possible, but it won’t all display. I tested selecting it and even the parts that don’t display end up in my clipboard, so there ya go.
#!/bin/bash
shopt -s extglob
isint(){
case $1 in
?([-+])+([0-9]) )
return 0;;
*) return 1;;
esac
}
if [[ -d ~/.ssh ]]; then
# Touch files we expect to exist
if [[ ! -e ~/.ssh/config ]]; then touch ~/.ssh/config; fi
if [[ ! -e ~/.ssh/known_hosts ]]; then touch ~/.ssh/known_hosts; fi
# Parse ~/.ssh/known_hosts and ~/.ssh/config to find hosts
for x in `sed -e 's/[, ].*//' ~/.ssh/known_hosts; awk '/^Host [^*?]+$/{print $2}' ~/.ssh/config`; do
# Don’t override commands
type "${x}" > /dev/null 2>&1 && continue
# Remove the domainname
y=${x%%.*}
# you don't want IP addresses for aliases, trust me.
isint $y && continue
# If it's a short-name, move on
#z=${x##*.}
#[[ "${z}" == 'edu' || "${z}" == 'com' || "${z}" == 'net' ]] || continue
# So the above is commented out because you'd be surprised at how much
# you rely on your search path. You should pipe the output of this script to
# sort and your fqdn's will override your shorts.
echo alias "${x}"=”ssh $x”
if [[ "$y" != "$x" ]]; then
if ! type $y > /dev/null 2>&1; then
echo alias $y=”ssh $x”
fi
fi
done
fi
Dennis also mentions that you might want to add HashKnownHosts no to your ~/.ssh/config file. If you have some hashed keys in your file, you should remove them before running this script. Sadly I couldn’t find any way to programmatically convert a hashed file into a non-hashed file. But to make up for it, here’s a bonus alias!
# removes _exactly what you type_ from ~/.ssh/known_hosts # meaning 'grapes' gets you the key for 'grapes' vs 'grapes.wrath.com' alias forget="ssh-keygen -R"
29 Jul 2008 sam 0 comments