Автоматически заполните имена серверов для SSH и SCP

ProFTPD может использоваться таким образом, Вы описываете; его mod_sftp модуль поддерживает SCP, и он может использовать множество механизмов аутентификации пользователя. Перед вскакиванием необходимо быть осведомлены об этих фактах:

  • Вы будете расширять область поверхности атаки своего сервера
  • ProFTPD перенес более частые и серьезные уязвимости системы обеспечения безопасности, чем OpenSSH в прошлых годах пары
  • Ваша служба ProFTPD SCP и OpenSSH не могут совместно использовать порт 22

У меня есть личный опыт с помощью этого решения на крупном предприятии по точной причине, которую Вы обрисовываете в общих чертах - у удаленных пользователей не должно быть локальных системных учетных записей (сервисное требование для той конкретной базы пользователей). Единственный дополнительный протест, который я добавлю, состоит в том, что конфигурация может быть пугающей для выполнения той же степени пользовательского разделения, что типичная система считает предложение. К тому же чрезвычайно гибкая конфигурация ProFTPD предлагает более интересные возможности управления доступом, чем OpenSSH.

63
10.06.2014, 10:13
6 ответов

Если вы хотите использовать SSH, вы, очевидно, хотите установить ключи ssh для ввода без пароля, или вы будете вынуждены вводить пароль каждый раз. Ключи SSH, очевидно, гораздо более безопасны. Команда ssh может использоваться для отправки команды на пульт дистанционного управления, а затем выхода после завершения команды:

ssh root@remoteserver COMMAND

В вашем случае:

ssh root@remoteserver [yum,apt-get,etc] install package

Но без ключей ssh все равно придется подключить пароль. Если вы хотите запускать несколько одновременно, что-то простое, что вы можете сделать, это передать серверы в цикл for. НО снова без пароля ssh вам будет предложено ввести пароль при каждом подключении к серверу.

for i in remoteserver1 remoteserver2 remoteserver3; do ssh root@$i [yum,apt-get,etc] install package ; done

Существует также утилита под названием sshpass , которая может быть полезна для того, что вы ищете (никогда не использовали ее), но я бы рекомендовал ssh keys для простоты и безопасности.

-121--175174-

Если используется e grep, что означает grep с расширенным синтаксисом regexp, то для передачи образца в sed необходимо добавить parametr -r (--regexp-extended) или -E в некоторых версиях.

Что касается вашего выражения, у вас есть дополнительный \ после c , поэтому даже с egrep он не соответствует

Кроме того, лучше использовать \1 вместо $1 для обратного сопоставления.

Поэтому окончательная команда может быть:

sed -rn 's:\./(RFF.*)( .* -c)\$\{COND\}:./\1\2\1:gp'

Или

sed -rn 's:(\./(RFF\S*) \S* -c)\$\{COND\}:\1\2:gp'
-121--161375-

Найдена!!

Похоже, что в Ubuntu записи в ~/.ssh/известных узлах _ хэшированы , поэтому завершение SSH не может их прочитать. Это функция, а не ошибка. Даже при добавлении HashKnureHosts no в ~/.ssh/config и /etc/ssh/ssh _ config мне не удалось предотвратить хэширование хоста.

Однако хосты, которые меня интересуют, также находятся в ~/.ssh/config . Вот скрипт для Bash Completion, который считывает записи из этого файла:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Поместите этот скрипт в /etc/bash _ completion.d/ssh , а затем отправьте его с помощью следующей команды:

$ . /etc/bash_completion.d/ssh

Я нашел это руководство бесценным, и я не смог бы создать сценарий без него. Спасибо Стиву Кемпу за написание этого потрясающего руководства!

67
27.01.2020, 19:32

Pre-packaged

Вы не говорите, какой дистрибутив вы используете, но на моей системе Fedora 19 у меня установлен следующий пакет, bash-completion, который предоставляет эту возможность с помощью этого файла с правилами завершения:

/usr/share/bash-completion/completions/ssh

Вот пакет, который я установил:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

Если вы посмотрите в этот файл правил, вы увидите строфы, которые опрашивают $HOME/. ssh/config файл:

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

Прокручивая свой собственный

я также нашел Gist, known_hosts_autocomplete.sh, который делает нечто похожее, за исключением файла $HOME/.ssh/known_hosts.

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

Вы можете сделать нечто подобное, используя ваш файл $HOME/.ssh/config, если по какой-то причине вы не можете найти файл с правилами завершения для ssh, уже упакованного.

.
16
27.01.2020, 19:32

на Ubuntu 14.04, SSH SSH Автообслуживание серверов, упомянутых в вашем ~ / .ssh / config

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

Вот запись для тех, кто спрашивает:

HOST server-name 
    GSSAPIAuthentication=no

Я был бы очень удивлен, если это имело значение то, что вы указали на конфиге (до сих пор, пока он все еще действителен, конечно).

3
27.01.2020, 19:32

Я обнаружил, что автозаполнение не работало, потому что хэши Ubuntu известные хосты. Вы можете добавить

Host *
    HashKnownHosts no

на ваш .ssh / config файл, но существующие хосты не будут не хешированы.

7
27.01.2020, 19:32

Чтобы включить автозаполнение ssh в Debian и Ubuntu:

sudo apt-get install bash-completion

Обратите внимание, что это не имеет ничего общего с хешированием known_hosts, наоборот к сказанному выше и исходному вопросу. Если вы хотите выполнить автозаполнение из known_hosts, тогда, конечно, вам придется отключить хеширование, но это настоятельно не рекомендуется.

Например, у меня есть:

Host *
    HashKnownHosts yes

в моем .ssh / config, и у меня все еще есть автозаполнение ssh, отлично работающее с хостами, перечисленными в .ssh / config и / etc / hosts. Вам нужно добавить хост в .ssh / config, как указано в OP:

Host my-awesome-host Имя хоста the.real.host.name

(Или вы можете добавить хост запись в / etc / hosts, который является еще одним источником сценариев Debian / Ubuntu.)

Затем вы можете просто ввести ssh my-awe , и он будет автоматически завершен. Опять же, это даже если вы HashKnownHosts, что настоятельно рекомендуется. (Обратите внимание, что завершение bash должно быть включено в вашей оболочке bash, и вам нужно специально установить эти сценарии, как указано выше, для вашего дистрибутива.)

Затем добавьте эти строки в свой .bashrc , чтобы включить его (требуется выход и повторный вход в систему, или просто введите новый bash , чтобы запустить новую оболочку. (Вам не нужно включать, если он уже включен в /etc/bash.bashrc и / etc / profile источниках /etc/bash.bashrc ) .

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Это включит автозаполнение ssh (среди прочего!) Из ~ / .ssh / config , / etc / hosts и т. Д.

Обратите внимание, что Debian по умолчанию ash вместо bash. Вы можете легко переключиться на bash:

sudo usermod -s /bin/bash "$USER"

(Вам нужно будет выйти и снова войти в систему, чтобы это вступило в силу.)

3
27.01.2020, 19:32

В CentOS 7 достаточно было yum install bash-completionдля автоматического завершения хостов из .ssh/configпри вводе sshи нажатии вкладки .

1
03.02.2021, 13:49

Теги

Похожие вопросы