#python #python-3.x
#python #python-3.x
Вопрос:
- Найдите строку, начинающуюся с «#PermitRootLogin yes» и замените на «PermitRootLogin no»
- Добавьте строку внизу с надписью «Разрешенные пользователи user1@test.com «
- Перезапустите демон 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