6

Как я могу изменить значение, скажем, PasswordAuthentication в /etc/ssh/sshd_config в командах?

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

Примерные значения:

PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
UseDNS no

4 ответа4

11

Регулярные выражения и sed могут помочь с такими вещами.

sed -re 's/^(PasswordAuthentication)([[:space:]]+)no/\1\2yes/' -i.`date -I` /etc/ssh/sshd_config

В моей системе Debian это переключит PasswordAuthentication no на PasswordAuthentication yes , независимо от количества пробелов между ключом и значением.

Он заменит параметр в файле (редактирование на месте) при создании резервной копии исходного файла с суффиксом, названным датой (sshd_config.2014-05-28).

Поменяйте местами для да и нет, чтобы переключиться в другую сторону.

Выражение для удаления ведущего # выглядит примерно так:

 sed -re 's/^(\#)(PasswordAuthentication)([[:space:]]+)(.*)/\2\3\4/' 

и для вставки начального знака # :

 sed -re 's/^(PasswordAuthentication)([[:space:]]+)(.*)/#\1\2\3/' 

Чтобы переключить строку с необязательным знаком # перед (спасибо, Barlop):

sed -re 's/^(\#?)(PasswordAuthentication)([[:space:]]+)no/\2\3yes/' 

Во всех этих выражениях вы можете изменить PasswordAuthentication на любой другой параметр, который вы хотите изменить - возможно, даже сделать его ключом в скрипте оболочки и создать "инструмент переключения опции sshd".

Sed и regex - это все веселье и игры, но я уверен, что Валентин прав в том, что управление конфигурацией - это путь, если у вас много систем. Лично я просто использую etckeeper/bazaar на нескольких системах, которые меняются очень редко - это не управление конфигурацией, а обеспечение версионности, так что я могу получить рабочую конфигурацию после того, как я испортил regex и sed -i . :)

5

Есть несколько вариантов на выбор:

  • Puppet, Cfengine, Chef или любой другой инструмент управления конфигурацией
  • Augeas (augtool -> print /files /etc /ssh /sshd_config -> затем используйте "set")
  • сед-я
  • и многое другое

Попытавшись угадать, куда вы хотите пойти, вы, вероятно, все равно захотите использовать управление конфигурацией.

3

Augeas с помощью инструмента командной строки - augtool - может настроить /etc/ssh/sshd_config. Например:

augtool --autosave 'set /files/etc/ssh/sshd_config/PasswordAuthentication yes'

Чтобы установить все значения, используйте:

SSHD_UsePAM=no
SSHD_UseDNS=no
augtool << EOF
set /files/etc/ssh/sshd_config/PermitRootLogin no
set /files/etc/ssh/sshd_config/ChallengeResponseAuthentication no
set /files/etc/ssh/sshd_config/PasswordAuthentication no
set /files/etc/ssh/sshd_config/UsePAM ${SSHD_UsePAM}
set /files/etc/ssh/sshd_config/UseDNS ${SSHD_UseDNS}
save
EOF
1

sshd_config не может быть безопасно отредактирован без анализа полностью, потому что он может содержать блоки Match .

Augeas - хороший вариант для достижения этой цели, но не так просто управлять параметрами вставки в нужном месте, когда уже есть блоки Match . Одним из вариантов является использование Puppet с провайдером на основе sshd_config Augeas:

sshd_config { "PermitRootLogin":
  ensure => present,
  value  => "yes",
}

Эта опция дает вам преимущество использования строгого парсера (Augeas с линзой Sshd.lns ) и уровня абстракции (ресурс Puppet), который управляет сложностью установки параметров как вне блоков Match , так и внутри них:

sshd_config { "X11Forwarding":
  ensure    => present,
  condition => "Host foo User root",
  value     => "yes",
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .