Учитывая отличные ответы на вопрос о научной фантастике "Предотвращение атак грубой силы на SSH", Я подумываю о настройке блокировки портов на тестовом сервере. Я обсуждаю, как я легко подключусь к этому серверу и к другим серверам с блокировкой портов.
Обычно я настраиваю аутентификацию, адреса и имена пользователей rsa в /.ssh/config
в качестве таких:
Host msUpdate
User bgates
Hostname updates.microsoft.com
IdentityFile ~/.ssh/id_rsa.bgates.pub
Таким образом, я могу просто ввести ssh msUpdate
войти на сервер. Насколько я знаю /.ssh/config
не имеет средства для настройки блокировки портов. Таким образом, я рассматриваю сценарий оболочки для ssh
который будет автоматически обрабатывать стук:
$ cat login
#!/bin/bash
msUpdate=( 2000 3000 4000 )
otherServer=( 1024 2048 4096 )
for PORT in ${$@}; do
ssh -p $PORT
sleep 1
done
ssh $@
У меня вопрос, как написать for
линия. Кажется, я не могу заставить скрипт распознавать аргумент как имя массива для замены. Хотя якобы это вопрос Bash, я задаю его в SF, потому что я чувствую, что завершенный сценарий будет наиболее полезен для пользователей этого сайта, а также потому, что если есть лучший способ, чем он, скорее всего, будет здесь, кто-то даст мне знать о Это.
Вам нужно использовать имя массива в вашем цикле for
for PORT in "${msUpdate[@]}"
do
ssh -p $PORT host.tld
done
Лучше субъективно, я видел, как выбивание портов реализовано с помощью такого скрипта, но он использовал nmap для стука, а не ssh
for PORT in "${msUpdate[@]}"
do
nmap -Pn --host_timeout 100 --max-retries 0 -p $PORT host.tld
done
ssh -p someport host.tld
Вы также можете рассмотреть альтернативу, например Duo Securityдвухфакторная аутентификация.
Вы пытаетесь использовать косвенное обращение, но ассоциативный массив (он же «хеш») - лучший подход. Вам нужно будет использовать язык, поддерживающий эту функцию, например Bash 4, AWK, ksh93, Perl, Python и т. Д.
Если у вас есть Bash 4, вы можете использовать ассоциативные массивы следующим образом. Значения не могут быть массивами, но вы можете использовать списки портов, разделенные пробелами, поскольку члены списка не будут включать пробелы.
#!/bin/bash
declare -A servers
servers[msUpdate]='2000 3000 4000'
servers[otherServer]='1024 2048 4096'
for port in ${servers[$1]}
do
ssh -p "$port" "$1"
sleep 1
done
ssh "$1"
Вызовите скрипт с именем сервера, на который хотите войти:
./scriptname otherServer
Используйте в качестве имени сценария что-то другое, кроме «логина», поскольку это имя существующего исполняемого файла.
Всегда избегайте использования имен переменных, начинающихся с заглавных букв, чтобы предотвратить возможное столкновение имен с переменными оболочки.