OPENLDAP关于ldapsearch导出含中文的数据被加密的问题解决

背景: 当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:

中文字的部分就可以正常顯示了!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值