Спасибо, Арек, за вдохновение...
Вместо того, чтобы запускать другой процесс оболочки, это просто функция, выполняемая в текущей оболочке bash. Он запускает один awk
команда для анализа конфигурационного файла и определения, должен ли он принимать пароль из переменной оболочки или из пароля, записанного открытым текстом в конфигурационный файл ssh (с awk
в одном eval
вместо describe
из-за проблем, с которыми я столкнулся, используя describe
).
Я перепробовал так много способов использования sshpass
непосредственно в ssh
конфигурационный файл с использованием ProxyCommand, но, похоже, ничего не работало так, как ожидалось, за исключением случаев, когда я мог войти в ящик через RSA, а затем мне нужно было отправить пароль, чтобы открыть мой зашифрованный каталог. Тем не менее, моя приведенная ниже функция, похоже, работает для меня во всех случаях, даже для Cygwin.
# In your .bash_profilefunction 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=SomePasswordMYPASSWD_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
это переменная среды, содержащая ваш пароль.
Наслаждайтесь!
И что-то для обработки большинства сценариев scp (не полностью конкретизированное, но, по крайней мере, начало ...)
function scp(){ host=$(echo $* | perl -pe 's/^.*?([A-Za-z-1-9-]+):.*?$/\1/;'); unset PASSWORD unset PASSVAR eval $(awk "/#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$1; 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 #echo /usr/bin/scp -3 $* /usr/bin/scp -3 $* || true #echo "SSH Exit Code $?" else if [[ -n "$PASSVAR" ]]; then #PASSWORD=`echo ${!PASSVAR}` PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-}) fi #echo /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/scp -3 $* /usr/bin/sshpass -p"$PASSWORD" /usr/bin/scp -3 $* || true #echo "SSHPass Exit Code $?" fi}