Я использую ubuntu 11.10. Я использую ssh для ежедневного подключения ко многим серверам, поэтому я помещаю их параметры в файл .ssh/config
; например:
Host Home
User netmoon
Port 22
HostName test.com
Есть ли способ установить пароли в этом файле для каждого соединения? Поэтому, когда сервер запрашивает пароль, терминал ставит свой пропуск и отправляет его на сервер.
Это потому, что иногда я стою от компьютера, а когда я возвращаюсь и набираю пароль, и нажимаю enter, терминал говорит CONNECTION CLOSED ,
Защита от безопасности для удобства никогда не заканчивается хорошо ...
Не могли бы вы использовать ssh-copy-id из пакета openssh-client?
Из man ssh-copy-id:
[F1]Если вы действительно не хотите использовать пару открытого / закрытого ключа, вы можете написать скрипт expect для автоматического ввода пароля в зависимости от адреса назначения.
Изменить: что Я имею в виду, что у вас может быть сценарий, который, с одной стороны, использует expect для ввода пароля для вас и, с другой стороны, считывает пароль для данного пользователя и хоста из файла конфигурации. Например, следующий сценарий python будет работать в сценарий солнечного дня:
#!/usr/bin/python
import argparse
from ConfigParser import ConfigParser
import pexpect
def 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_1
host2 = passwd_2
[user_2]
host1 = passwd_1
host2 = passwd_2
Примечание: Как объяснялось, скрипт python должен быть намного сложнее для обработки всех возможных ошибок и ответов на вопросы из ssh и всех возможных URL-адресов (в примере предполагается, что это будет что-то вроде user@host, но пользовательская часть не используется большую часть времени), но основная идея все равно будет такой же. При изменении конфигурационного файла вы можете использовать другой файл конфигурации или использовать .ssh/config и написать свой собственный код для разбора этого файла и получения пароля для данного пользователя и хоста.
Для этого также существует sshpass программа. Как использовать: sshpass -p MyPa55word ssh me@myservor.com
Единственная реальная альтернатива - использовать секретные ключи, но вы сказали, что не хотите (почему бы и нет?).
Как насчет ProxyCommand:
Host Home-raw
HostName test.com
Host 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
Я использую приложение из программного обеспечения VanDyke под названием SecureCRT.
http://www.vandyke.com/products/securecrt/
Это не бесплатная, но очень разумная цена , Я использовал его в течение многих лет (работает в Windows или с помощью Wine) для удаленного доступа, эмуляции терминала и (распределенного) сетевого управления. Наконец, они выпустили родную версию Linux в начале 2011 года.
У этого есть поддержка сложных настроек входа (или скриптов), сохраненных паролей (или сертификатов), вкладок нескольких сеансов и т. Д. [!d5 ]
При запуске вы можете выбрать удаленный объект (и протокол) из структурированного списка (древовидного) хранимых удаленных (или локальных) машин или просто создать соединение (которое затем сохраняется).
Я нашел это особенно полезным для удаленных сайтов с расширенной аутентификацией, нестандартными портами или согласованием доступа к брандмауэру.
Если вы много работаете с удаленным доступом (часть вашей основной роли), это приложение оправдает свои расходы в первый месяц использования.
Вы можете создать простую замену скрипта ssh в / usr / local / bin:
#!/bin/bash
host=$1
password=`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
Ответ @BrunoPereira на этот вопрос показывает альтернативный метод подключения без явного ввода пароля и исключения ключей ssh.
Вы можете создать скрипт, псевдоним или функцию в своем ~/.bashrc чтобы быстро выполнить эту команду.
Очевидно, что вы должны учитывать это соображение безопасности.
Отвечая на заданный вами вопрос, нет необходимости настраивать пароль по умолчанию в файле конфигурации ssh.
Но если действительно, как вы говорите «Это потому, что иногда я стою от компьютера, и когда я иду назад и введите пароль, и нажмите enter, терминал сказал CONNECTION CLOSED. ", то почему бы не предотвратить закрытие сеанса вместо этого? SSH может поддерживать связь для вас.
Host Home
User netmoon
Port 22
HostName test.com
ServerAliveInterval 300
ServerAliveCountMax 2
Вот мой подробный вариант ответа @ ArekBurdach. Он предлагает следующие расширения:
хост может находиться где угодно в командной строке ssh; т.е. он также поддерживает синтаксис ssh <args> <host> <commands>, не затрудняет кодирование пути к ssh более надежный синтаксический разбор ssh_config Бонус: оболочка для scp тоже#!/bin/bash
password=$(awk '
BEGIN {
# Collect the SSH arguments as keys of a dictionary, so that we can easily
# check for inclusion.
for (i = 2; i < ARGC; i++) {
sshArgs[ARGV[i]] = 1
}
# Only process the first argument; all others are the command-line arguments
# given to ssh.
ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
if ($2 in sshArgs)
inhost=1
else
inhost=0
}
' ~/.ssh/config "$@")
if [ "$password" ]; then
sshpass -p "$password" "$(which ssh)" "$@"
else
"$(which ssh)" "$@"
fi
#!/bin/bash
password=$(awk '
BEGIN {
# Collect the SCP arguments as keys of a dictionary, so that we can easily
# check for inclusion.
for (i = 2; i < ARGC; i++) {
colonIdx = index(ARGV[i], ":")
if (colonIdx > 0) {
scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
}
}
# Only process the first argument; all others are the command-line arguments
# given to scp.
ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
if ($2 in scpArgs)
inhost=1
else
inhost=0
}
' ~/.ssh/config "$@")
if [ "$password" ]; then
sshpass -p "$password" "$(which scp)" "$@"
else
"$(which scp)" "$@"
fi
Определите псевдонимы в вашем ~/.bashrc:
alias ssh=ssh-wrapper
alias scp=scp-wrapper
С директивой IgnoreUnknown, ssh не жалуется на недавно введенную директиву Password, поэтому (в отличие от ответа @ ArekBurdach) мы можем сделать это как «реальную» конфигурацию. Если вам это не нравится, тривиально изменить сценарий на закомментированный.
# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password
Host foohost
User baruser
Password foobarpassword
Если у вас нет прямого доступа к паре ключей, вы можете зашифровать пароль на своей локальной машине.
Способ сделать это - зашифровать ваш пароль, используя ключ в дополнение к @Eric Woodruff ' s. proxyCommand.
Способ комбинирования - использовать pipe:
openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password | sshpass ssh real-destination -tt
где
Host real-destination
Hostname test.com
User netmoon
Спасибо Arek за вдохновение ...
Вместо того, чтобы запускать другой процесс оболочки, это просто функция, запущенная в текущей оболочке bash. Он запускает одиночный awk для анализа файла конфигурации и выясняет, следует ли брать пароль из переменной оболочки или из файла, написанного с помощью пароля, в файл конфигурации ssh (с awk в eval вместо описания из-за проблем, с которыми я сталкивался, используя описание). Я пробовал так много способов использования sshpass непосредственно в конфигурационном файле ssh с помощью ProxyCommand, но ничего не работало так, как ожидалось, за исключением случаев, когда я мог входить в ящик через rsa, но затем мне нужно было отправить пароль для открытия моего зашифрованного каталога.
function ssh(){
host=$1;
unset PASSWORD
unset PASSVAR
eval $(awk "/#Passvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } /#Password / && inhost { printf \"PASSWORD=%s\",\$2; } /^Host / && inhost { inhost=0; exit 1 } /^Host $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
}
Тогда секция ~/.ssh/config
выглядит так:
Host MyHostname
Port 22
Hostname 2.1.2.2
User merrydan
#Passvar MYPASS_ENVVAR
#Password Some!Password
Если в разделе конфигурации существует #Passvar
, это переопределяет #Password
. $MYPASS_ENVVAR
- переменная среды, содержащая ваш пароль.
Наслаждайтесь!