Дякую, Арек за натхнення ...
Замість того, щоб запускати інший процес оболонки, це лише функція, що працює в поточній оболонці bash. Він працює один awk
команду для розбору файлу конфігурації і з'ясувати , якщо він повинен взяти пароль з змінної оболонки або пароль написано відкритого тексту в файл конфігурація SSH (з awk
в eval
замість describe
з - за проблеми , які я вдарив використання describe
).
Я спробував так багато способів використання sshpass
безпосередньо у ssh
конфігураційному файлі за допомогою ProxyCommand, але, здається, нічого не працювало так, як очікувалося, за винятком випадків, коли я міг увійти до вікна через RSA. Але тоді мені потрібно було надіслати пароль, щоб відкрити зашифрований каталог. Однак, здається, що моя функція нижче працює у всіх випадках, навіть у Cygwin.
# In your .bash_profile
function ssh(){
host=$1;
unset PASSWORD
unset PASSVAR
eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
/usr/bin/ssh -q $* 2>/dev/null
else
if [[ -n "$PASSVAR" ]]; then
PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
fi
/usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)
Тоді ~/.ssh/config
розділ виглядає так:
Host MyHostname
Port 22
Hostname 2.1.2.2
User merrydan
#Passvar MYPASS_ENVVAR
#Password Some!Password
Якщо #Passvar
існує в розділі config, це переосмислює #Password
.
$MYPASS_ENVVAR
це змінна середовище, що містить ваш пароль.
Насолоджуйтесь!