背景: 当ldap的条目中或属性中出现中文,ldap使用slapcat或者ldapsearch查看的时候这一个属性的值都会被加密,从而使我们不能和之前导入的属性信息对照;接下来的步骤是将该输出中加密部分解密后转码显示为能和之前导入信息相比较的数据显示方式。
第一步:编写一个以.php结尾的文件,这边命名为:utf8ldif.php
<?php
function fn_output($str) {
if (strpos($str,":: ") > 0) {
//解 Base64 编码
//当 ldap 栏位名称后面接的是两个冒号即表示该栏位内容为 Base64 编码
$head = substr($str,0,strpos($str," ")-1);
$body = substr($str,strpos($str," ")+1);
$str = $head . " " . base64_decode($body) . "\n";
} else if (preg_match('/\x5c[A-F0-9][A-F0-9]\x5c[A-F0-9][A-F0-9]/',$str)) {
//解 URL 编码
//URL 编码出现在注解 (#), ldapsearch -LLL 可取消输出注解内容
$str = urldecode(str_replace("\\","%",$str));
}
if (!preg_match('/\n$/',$str)) {
//如果处理过后的字串没有换行符号 (\n) 就塞一个给他
$str .= "\n";
}
return($str);
}
$line_old = "";
$line_merge = "";
$params = count($argv);
if ($params == 1) {
//未给参数时, 开启 STDIN 串流
$f = fopen("php://stdin","r");
} else {
//开启指定档案
$f = fopen("$argv[1]","r");
}
while (!feof($f)) {
$line = fgets($f);
if (substr($line,0,1) == " ") {
//若该行行首为空白字元, 表示因内容过长而断行
//以 line_merge 变数合并各段落
if ($line_merge == "") {
$line_merge = trim($line_old) . trim($line);
} else {
$line_merge .= trim($line);
}
} else if ($line_merge > "") {
//输出合并好的内容
echo fn_output($line_merge);
$line_merge = "";
} else {
//输出一般内容
echo fn_output($line_old);
}
$line_old = $line;
}
fclose($f);
?>
第二步,检查php命令是否安装,如没有安装就去安装,这里我就不说怎么安装了。给个思路,把ldap可视界面安装上去的同时会安装php
第三步,使用正常命令将信息打印在页面上就可以看到了,重定向后,也可以保存在文件中。
ldapsearch -x -b 'dc=example,dc=com' |php ./utf8ldif.php
相关知识点,友情链接:
http://blog.ilc.edu.tw/blog/index.php?op=printView&articleId=467821&blogId=25793
这个网页的具体内容如下
将 ldapsearch 输出内容 (LDIF) 转 UTF-8 编码
星期四, 26th 十二月 2013
虽然在 ldapadd 汇入 LDIF 格式档时,已经将档案内容转换 UTF-8 格式,可常汇入了,但是在 ldapsearch 搜寻资料时,看到的却是乱码
cn 的部分应该是正常的中文字,但现在显示的却是乱码
# /usr/bin/ldapsearch -x -b "ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw" uid=*
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#
# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn:: 5p6X5pit5ZCN
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1 底下的内容参考 PHP 程式: ldapsearch 输出内容 (LDIF) 转 UTF-8 编码 « Jamyy's Weblog
# 建立 php 的转换档
# vim /root/utf8ldif.php
<?php
function fn_output($str) {
if (strpos($str,":: ") > 0) {
//解 Base64 编码
//当 ldap 栏位名称后面接的是两个冒号即表示该栏位内容为 Base64 编码
$head = substr($str,0,strpos($str," ")-1);
$body = substr($str,strpos($str," ")+1);
$str = $head . " " . base64_decode($body) . "\n";
} else if (preg_match('/\x5c[A-F0-9][A-F0-9]\x5c[A-F0-9][A-F0-9]/',$str)) {
//解 URL 编码
//URL 编码出现在注解 (#), ldapsearch -LLL 可取消输出注解内容
$str = urldecode(str_replace("\\","%",$str));
}
if (!preg_match('/\n$/',$str)) {
//如果处理过后的字串没有换行符号 (\n) 就塞一个给他
$str .= "\n";
}
return($str);
}
$line_old = "";
$line_merge = "";
$params = count($argv);
if ($params == 1) {
//未给参数时, 开启 STDIN 串流
$f = fopen("php://stdin","r");
} else {
//开启指定档案
$f = fopen("$argv[1]","r");
}
while (!feof($f)) {
$line = fgets($f);
if (substr($line,0,1) == " ") {
//若该行行首为空白字元, 表示因内容过长而断行
//以 line_merge 变数合并各段落
if ($line_merge == "") {
$line_merge = trim($line_old) . trim($line);
} else {
$line_merge .= trim($line);
}
} else if ($line_merge > "") {
//输出合并好的内容
echo fn_output($line_merge);
$line_merge = "";
} else {
//输出一般内容
echo fn_output($line_old);
}
$line_old = $line;
}
fclose($f);
?>
使用方式
# /usr/bin/ldapsearch -x -b "ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw" uid=* | php /root/utf8ldif.php
# extended LDIF
#
# LDAPv3
# base <ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=*
# requesting: ALL
#
# t850008, Teacher, ldap.tces.ilc.edu.tw
dn: uid=t850008,ou=Teacher,dc=ldap,dc=tces.ilc.edu.tw
uid: t850008
cn: 林昭名
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /bin/bash
uidNumber: 953
gidNumber: 500
homeDirectory: /home/t850008
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries:
中文字的部分就可以正常显示了!