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