我尝试了几个小时让我的自定义脚本在使用时工作hosts.allow/hosts.deny
,以防止连接到 SSH 和其他支持服务TCP 包装器来自未列出的国家。
SSH 示例:
主机拒绝文件
sshd : ALL
主机.允许文件
sshd: ALL: spawn /usr/local/bin/country_filter %h
国家过滤器脚本:
#!/bin/bash
# Specify the two-letter ISO Country Code(s) to accept
ALLOW_COUNTRIES="RU\|CY" # list of country codes in the exampled format ("RU\|GR\|CY")
COUNTRY=`/usr/bin/geoiplookup $1 | /bin/grep -w $ALLOW_COUNTRIES`
[[ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"
if [ $RESPONSE = "ALLOW" ]
then
echo "$RESPONSE"
exit 0
else
echo "$RESPONSE"
exit 1
fi
上面的脚本在控制台上运行得很好,但我不能使其工作,使用时主机.允许。
我在这里缺少什么?
答案1
如手册页中所述hosts_options(5)
,标准输出被重定向到/dev/null
,因此您没有机会从 获取输出echo
。当您希望考虑退出状态时,您应该使用aclexec
而不是spawn
.事实上,手册页说aclexec
:“连接将被允许或拒绝,具体取决于命令是否返回 true 或 false 退出状态。”