如何用Bash将FQDN转换为LDAP DN?精简函数或用单行命令
如何用Bash快速将FQDN转换为LDAP DN格式?
问题描述
在配置LDAP服务器的Bash脚本中,需要将完全限定域名(FQDN)转换为LDAP专有名称(DN),转换规则示例如下:
com→dc=comworld.com→dc=world,dc=comhello.world.com→dc=hello,dc=world,dc=comhello.beautiful.world.com→dc=hello,dc=beautiful,dc=world,dc=com
我自己实现了一个转换函数,但代码略显冗长,想了解是否有单行Bash命令可以直接实现,或者怎么精简现有函数。原函数代码如下:
#!/bin/bash function fqdn_to_ldap_dn() { local fqdn parts dn fqdn="$1" IFS=. parts=(${fqdn##*-}) dn="" for i in "${parts[@]}" ; do dn+="dc=$i," done dn=${dn%?}; echo $dn } echo $(fqdn_to_ldap_dn "aa.hello.com")
解决方案
1. 单行sed命令实现
直接用sed即可完成转换,无需自定义函数:
# 示例:转换aa.hello.com echo "aa.hello.com" | sed 's/\./,dc=/g; s/^/dc=/;'
工作原理:
s/\./,dc=/g:将字符串中所有的.替换为,dc=s/^/dc=/:在字符串开头添加dc=前缀
执行后会直接输出dc=aa,dc=hello,dc=com,完全符合转换要求。
2. 精简版Bash函数
如果偏好使用函数,可以利用Bash的参数展开特性大幅简化代码:
function fqdn_to_ldap_dn() { echo "dc=${1//./,dc=}" }
工作原理:
${1//./,dc=}:将传入的第一个参数(FQDN)中所有的.替换为,dc=- 拼接前缀
dc=后直接输出结果
测试示例:
fqdn_to_ldap_dn "hello.beautiful.world.com" # 输出:dc=hello,dc=beautiful,dc=world,dc=com
3. awk实现方案
如果需要更灵活的字段处理,也可以用awk完成转换:
echo "aa.hello.com" | awk -F. '{for(i=1;i<=NF;i++) printf "dc=%s%s", $i, (i<NF?",":"\n")}'
工作原理:
-F.:以.作为字段分隔符拆分FQDN- 循环遍历每个字段,输出
dc=字段名,非最后一个字段后加逗号,最后一个字段后加换行
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

