2015-08-22 2 views
1

Я пытаюсь автоматически отключить ведение журнала в SSH через root. Я знаю, что могу вручную отредактировать файл и сделать это, но я хочу отключить регистрацию root через скрипт Bash (который я использую для инициализации моих серверов).sed match и заменить в файле, за исключением комментариев

Я не использовал sed много, но я думаю, что это то, что я должен использовать на основе this question.

Линия, которую я пытаюсь заменить, в /etc/ssh/sshd_config, является PermitRootLogin {any_value}. Значение по умолчанию {any_value} равно yes, но я хотел бы, чтобы это работало для любого значения (в той же строке).

Я пробовал команду sudo sed -i "/PermitRootLogin/c\PermitRootLogin no" /etc/ssh/sshd_config, но это также заменяет случайный комментарий, который содержит текст «PermitRootLogin».

Итак, я не хочу заменять строки, начинающиеся с токена комментария, #.

Вот соответствующие части файла я пытаюсь изменить (мои комментарии будут добавлены с «###»):

# Authentication: 
LoginGraceTime 120 
PermitRootLogin yes ### I want to replace this line with "PermitRootLogin no" 
StrictModes yes 

# PAM authentication via ChallengeResponseAuthentication may bypass 
# the setting of "PermitRootLogin without-password". 
# If you just want the PAM account and session checks to run without 

Ожидаемый результат:

LoginGraceTime 120 
PermitRootLogin no 
StrictModes yes 

# PAM authentication via ChallengeResponseAuthentication may bypass 
# the setting of "PermitRootLogin without-password". 
# If you just want the PAM account and session checks to run without 

Тогда , Я пробовал это: sed -i "\(^[\# ]\)+/PermitRootLogin/c\PermitRootLogin no" /etc/ssh/sshd_config.

Это дает мне ошибку: sed: -e expression #1, char 48: unterminated address regex.

Как я могу выполнить то, что я пытаюсь сделать? Спасибо!

+1

... и ожидаемый результат. –

ответ

2

Вы можете использовать это:

sed '/^#/!s/PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config 

Узор /^#/ соответствует строке, которая начинается с комментария. ! отрицает соответствие, означая, что последующая команда будет выполняться только для строк без комментариев.

Этот комментарий заменяет PermitRootLogin следующим образом: .* от PermitRootLogin no.

Используйте -i, как только вы убедитесь, что он работает правильно.

+0

Я хочу заменить все 'слово' на' newword', кроме 'wordlist', как? – alhelal

+0

Я рекомендую поставить вопрос - если вы не можете найти ответ. Замечания не подходят, чтобы спросить. – hek2mgl

+0

Я думаю, что мой вопрос касается подобного вопроса. – alhelal

2

Попробуйте это GNU СЭД:

sed -i 's/^PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config 
+2

Я думаю, что это должен быть ответ. почему вам будет интересно прокомментировать, если 'PermitRootLogin' находится в начале строки. Кстати, я думаю, что изменение '. *' на '[^ #] *' поможет, так как оно не заменяет завершающий комментарий вместе с коммутатором, если таковой имеется. – HuStmpHrrr

2

Попробуйте

sed -i "s/^[^#]*PermitRootLogin .*/PermitRootLogin no/g" file 

^: Beginning of line 
[^#]*: any character but no # 
Смежные вопросы