Спасибо, Арек за вдохновение ...
Вместо запуска другого процесса оболочки, это просто функция, запущенная в текущей оболочке 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 существует в разделе конфигурации это переопределяет #Password.
$MYPASS_ENVVARпеременная окружения, содержащая ваш пароль
Наслаждайтесь!