Затвердеть sshd_config через python

#python #python-3.x

#python #python-3.x

Вопрос:

  1. Найдите строку, начинающуюся с «#PermitRootLogin yes» и замените на «PermitRootLogin no»
  2. Добавьте строку внизу с надписью «Разрешенные пользователи user1@test.com «
  3. Перезапустите демон sshd

(Мой код)

 #!/usr/bin/python3
import fileinput

for line in fileinput.input("/etc/ssh/sshd_config", inplace=True), : 
    print (line.replace("#PermitRootLogin", "PermitRootLogin no"))
  

(Ошибка)

Трассировка (последний последний вызов): Файл «./assignment4-part1.py «, строка 6, в печати (line.replace(«#PermitRootLogin», «PermitRootLogin=no»)) Ошибка атрибута: объект ‘FileInput’ не имеет атрибута ‘replace’

(Примечания)

Я пробовал разные методы, как видно из других сообщений, выполняющих поиск и замену строки, но столкнулся с аналогичными проблемами / ошибками. Любые рекомендации будут высоко оценены. Я использую CentOS, и python3 установлен / обновлен.

Ответ №1:

У вас синтаксическая ошибка в вашем коде. В вашем for выражении цикла указана ошибочная запятая:

 for line in fileinput.input("/etc/ssh/sshd_config", inplace=True), : 
  

Это означает, что вы фактически выполняете итерацию по одноэлементному кортежу, содержащему fileinput.FileInput объект, а не по самому объекту.

Удалите запятую:

 for line in fileinput.input("sshd_config", inplace=True):                       
  

Две другие краткие рекомендации:

Не используйте print в своем цикле, потому print что добавляет новую строку, так что в итоге вы разместите весь файл с двойным интервалом. Вместо этого рассмотрим:

 for line in fileinput.input("sshd_config", inplace=True):                       
    sys.stdout.write(line.replace("#PermitRootLogin", "PermitRootLogin no"))              
  

Наконец, подумайте, что произойдет, если ваш входной файл содержит:

 #PermitRootLogin no
  

Ваш код перепишет это как:

 PermitRootLogin no no
  

Что недопустимо.

Комментарии:

1. спасибо за помощь. все еще сталкивался с некоторыми проблемами. если я помещу свой файл sshd_config в ту же папку, что и мой скрипт, при его запуске он стирает все в файле и выдает ошибку ниже.

2. спасибо за помощь. все еще сталкивался с некоторыми проблемами. если я помещу свой файл sshd_config в ту же папку, что и мой скрипт, при его запуске он стирает все в файле и выдает ошибку ниже.

3. Трассировка (последний последний вызов): файл «ssh-part1.py «, строка 6, в <module> sys.стандартный вывод. написать(строка.replace(«#PermitRootLogin», «PermitRootLogin no»)) Ошибка имени: имя ‘sys’ не определено

4. Перед использованием sys используйте import sys. Для получения более подробной информации о модуле sys. См. Ссылку ниже: docs.python.org/2/library/sys.html (python 2) и docs.python.org/3/library/sys.html (python 3)

5. @larsks, да, print добавляет новую строку. Это происходит потому, что » print » в python содержит параметр » end «, значение по умолчанию которого равно » n» (перевод строки ). Поэтому, если вы хотите использовать » print » в этом случае, используйте, инициализировав параметр » end » как пустой » «. Например: print(строка.replace(«#PermitRootLogin», «PermitRootLogin no»), end=») . Это будет работать так, как ожидалось.

Ответ №2:

Добавьте import sys в начало, если файл Python. И получите хорошее руководство для начинающих по Python:>

Или рассмотрите возможность использования GNU sed regex и вообще избегайте Python