Можете ли вы установить пароли в .ssh /config, чтобы разрешить автоматический вход в систему?

Я использую Ubuntu 11.10 и ssh для ежедневного подключения ко многим серверам, поэтому я ввожу их параметры в .ssh/config файл, подобный этому:

Host HomeUser netmoonPort 22HostName test.com

Есть ли способ поместить пароли для каждого соединения в этот файл, чтобы, когда сервер запрашивает пароль, терминал вводил свой пароль и отправлял его на сервер?

Мне это нужно, потому что иногда я нахожусь вдали от компьютера, и когда я вернусь, введите пароль и нажмите Enter терминал говорит CONNECTION CLOSED.

P.S. Я не хочу использовать пару открытых / закрытых ключей.

Обмен безопасностью на удобство никогда не заканчивается хорошо...

Не могли бы вы использовать ssh-copy-id из openssh-client посылка?

От man ssh-copy-id:

ssh-copy-id - это скрипт, который использует ssh для входа на удаленную машину и добавления указанного идентификационного файла в файл ~/.ssh/authorized_keys этой машины.

Если вы на самом деле не хотите использовать пару открытых / закрытых ключей, вы можете написать expect скрипт для автоматического ввода пароля для вас в зависимости от адреса назначения.

Редактировать: Я имею в виду, что у вас может быть сценарий, который, с одной стороны, использует expect чтобы ввести пароль для вас и, с другой стороны, считывает пароль для данного пользователя и хоста из файла конфигурации. Например, следующий скрипт на python будет работать для сценария солнечного дня:

#!/usr/bin/python                                                                                                                        import argparsefrom ConfigParser import ConfigParserimport pexpectdef main(args):    url = args.url    user, host = url.split('@', 1)    cfg_file = 'ssh.cfg'    cfg = ConfigParser()    cfg.read(cfg_file)    passwd = cfg.get(user, host)    child = pexpect.spawn('ssh {0}'.format(url))    child.expect('password:')    child.sendline(passwd)    child.interact()if __name__ == '__main__':    parser = argparse.ArgumentParser(description='Run ssh through pexpect')    parser.add_argument('url')    args = parser.parse_args()    main(args)

и формат файла конфигурации будет следующим:

[user_1]host1 = passwd_1host2 = passwd_2[user_2]host1 = passwd_1host2 = passwd_2

Примечание: Как было объяснено, сценарий python должен быть намного сложнее, чтобы обрабатывать все возможные ошибки и сообщения с вопросами от ssh и всех возможных URL-адресов (в примере предполагается, что это будет что-то вроде user@host, но пользовательская часть в большинстве случаев не используется), но основная идея все равно останется той же. Что касается файла конфигурации, вы можете использовать другой файл конфигурации или использовать .ssh/config и напишите свой собственный код, чтобы проанализировать этот файл и получить пароль для данного пользователя и хоста.

Как насчет ProxyCommand:

Host Home-raw    HostName test.comHost Home   User netmoon   Port 22   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

Вы можете использовать ssh -W вместо nc также:

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

Там также есть sshpass программа для этого.Как использовать:sshpass -p MyPa55word ssh me@myservor.com

Нет. Боюсь, это невозможно.

Единственная реальная альтернатива - использовать закрытые ключи, но вы сказали, что не хотите этого делать (почему бы и нет?).

Вы можете создать простую замену ssh-скрипта в /usr/local/bin:

#!/bin/bashhost=$1password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`if [[ -z "$password" ]]; then  /usr/bin/ssh $*else  sshpass -p $password /usr/bin/ssh $*fi

А затем в вашем файле ~ /.ssh /config вы можете использовать

Host foohost    User baruser    #Password foobarpassword

Я использую приложение от VanDyke Software под названием SecureCRT.

http://www.vandyke.com/products/securecrt/

Это не бесплатно, но по очень разумной цене. Я использовал его в течение многих лет (под управлением Windows или с помощью Wine) для удаленного доступа, эмуляции терминала и (рассредоточенного) управления сетью. В начале 2011 года они, наконец, выпустили собственную версию этого приложения для Linux.

Он поддерживает сложные настройки входа в систему (или скрипты), сохраненные пароли (или сертификаты), несколько сеансов с вкладками и т.д.

При запуске вы можете выбрать удаленную цель (и протокол) из структурированного списка (древовидного представления) сохраненных удаленных (или локальных) компьютеров или просто создать соединение (которое затем сохраняется).

Я обнаружил, что это особенно полезно для удаленных сайтов с расширенной аутентификацией, нестандартными портами или согласованием доступа к брандмауэру.

Если вы часто используете удаленный доступ (часть вашей основной роли), то это приложение оправдает свои расходы в первый месяц использования.

Отвечая на заданный вами вопрос, нет, невозможно настроить пароль по умолчанию в конфигурационном файле ssh.

Но если действительно, как вы говорите, это "потому что иногда я стою в стороне от компьютера, а когда возвращаюсь, набираю пароль и нажимаю Enter терминал говорит CONNECTION CLOSED", тогда почему бы вместо этого не предотвратить закрытие сеанса? SSH может поддерживать связь для вас.

Host Home  User netmoon  Port 22  HostName test.com  ServerAliveInterval 300  ServerAliveCountMax 2

Вдохновленный @Ответ Арека Бурдаха и оболочка других, я написал оболочку, которая должна быть более надежной, что облегчило анализ собственных команд ssh.

ОБНОВЛЕНИЕ 2021-04-26: Исправлена оболочка, когда хост соответствует только префиксу (например, хост отсутствует)

Вот как это работает:

  • Сначала мы запускаем ssh с помощью -v и несуществующей ProxyCommand, чтобы он не подключался к сети и не выходил сразу.
  • Затем мы извлекаем строку следующим образом debug1: /home/misty/.ssh/config line 42: Applying options for XXXXXX. Но ssh выводит errlog с помощью \r, поэтому мы заменили их перед переходом в grep.

Согласно моему тесту, ssh распознает только первую команду ProxyCommand= XXX в командной строке, даже если в командной строке есть вторая опция ProxyCommand или есть ProxyCommand в ~ /.ssh / config, так что наш метод будет очень и очень стабильным ;)

Для ssh

#!/usr/bin/env bashORISSH=/usr/bin/sshssh_dryrun=$($ORISSH -v -o "ProxyCommand=FAKE_PROXY_STUB %h %p" "$@" 2>&1 | sed -e 's/\r/\n/g')host=$( grep -oP 'Applying options for \K(.*?)$' <<< $ssh_dryrun | head -n 1 )if [[ $host == "*" ]]; then  password=''else  password=`awk "/#Password/ && inhost { print \\\$2 } /^Host/ { inhost=0 } /Host $host$/ { inhost=1 }" ~/.ssh/config`fiif [[ -z "$password" ]]; then  $ORISSH "$@"else  sshpass -p $password $ORISSH "$@"fi

Для scp:

#!/usr/bin/env bashORISCP=/usr/bin/scpscp_dryrun=$($ORISCP -v -o "ProxyCommand=proxyhost %h %p" "$@" 2>&1 | sed -e 's/\r/\n/g')host=$( grep -oP 'Applying options for \K(.*?)$' <<< $scp_dryrun | head -n 1 )if [[ $host == "*" ]]; then  password=""else  password=`awk "/#Password/ && inhost { print \\\$2 } /^Host/ { inhost=0 } /Host $host$/ { inhost=1 }" ~/.ssh/config`fiif [[ -z "$password" ]]; then  $ORISCP "$@"else  sshpass -p $password $ORISCP "$@"fi

Спасибо, Арек, за вдохновение...

Вместо того, чтобы запускать другой процесс оболочки, это просто функция, выполняемая в текущей оболочке 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}

Я нахожусь в такой же ситуации, и я не могу загрузить свой открытый ключ, потому что у меня есть доступ по ssh только для svn. То есть, если я попробую
ssh svnhost

Я получаю “( success ( 2 2 ( ) ( edit-pipeline svndiff1 отсутствует-записи фиксируются-revprops depth log-revprops partial-replay ) ) )” ответ svnserve, а не оболочка

See Tell SSH to use a graphical prompt for key passphrase - Unix & Linux Stack Exchange and http://andre.frimberger.de/index.php/linux/reading-ssh-password-from-stdin-the-openssh-5-6p1-compatible-way/ for a way by utilizing SSH_ASKPASS.