fail2ban 的 jam.conf 文件中的这些 %(...)s 字符串是什么?它们是如何工作的?

fail2ban 的 jam.conf 文件中的这些 %(...)s 字符串是什么?它们是如何工作的?

在设置过程中,fail2ban顶部的变量看起来jail.conf像这样:

mytime=300
.
.
.
[ssh]
bantime=%(mytime)s

或者采用更复杂的形式,如下所示:

action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"].

问题

  • 这些是如何工作的以及它们发生了什么?
  • 具体是怎么回事%(...string...)s

答案1

如果您查看其中包含的规则,fail2ban您会发现它们使用这些变量来使事情变得更整洁、更参数化。例如,在包含的内容中,jail.conf他们使用它们来制定一般操作规则,然后在定义各种监狱时可以使用这些规则。

例子

这是顶部的一些基本变量。

# Destination email address used solely for the interpolations in
# jail.{conf,local,d/*} configuration files.
destemail = root@localhost

# Sender email address used solely for some actions
sender = root@localhost

# Default protocol
protocol = tcp

# Ports to be banned
# Usually should be overridden in a particular jail
port = 0:65535

然后将这些变量用于其他变量来构造一些基本操作。

# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = iptables-multiport

# The simplest action to take: ban only
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report to the destemail.
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

请注意,这里他们正在构造一个名为 的通用操作,action_该操作是使用其他变量(例如 、 、 `%(protocol)s 等)创建%(banaction)s%(port)s

man jail.conf手册页:

使用 Python“字符串插值”机制,允许其他定义,并且稍后可以在其他定义中使用 %(name)s。例如。

         baduseragents = IE|wget
         failregex = useragent=%(baduseragents)s

所以它们%(...)s是Python语言的一部分。如果您搜索它们,您最终会从 Python 语言规范中找到此页面,特别是标题为:5.6.2.字符串格式化操作。此页面上有一个示例:

>>> print '%(language)s has %(number)03d quote types.' % \
...       {"language": "Python", "number": 2}
Python has 002 quote types.

在 Python 中称为%(...string...)s字符串格式化或插值运算符。末尾s%(...string...)是一个标志,指定可能传递给它的任何 Python 对象都将转换为字符串。从我引用的链接中,有一个包含允许的所有标志的表:

  SS#1

指定%您希望说明符开始的位置,并且 是(...string...)我们想要在此处扩展的 Python 变量。

相关内容