2021年8月25日 星期三

CentOS 7 安裝 Python 3

想在 CentOS7 使用 Python3 是有點小麻煩的。


RedHat 的套件政策是:主版本週期定為 10 年,主版本釋出後,所包含的套件都會維持主版本不變;例如:CentOS7 內含的 Python 版本是 2.7,在這 10 年間,Python 的版本就會是 2.7.x 的更新。


Python 因為太好用,所以許多套件將 Python 綁在一起,如果想要移除 Python2,會因為套件的相依性而連帶移除了其他原本不想或不能移除的套件!例如:重要的套件管理 yum。


但是,10 年是會有滄海滄田的變化的,雖然 RedHat / CentOS 的主要對象是企業,企業重視系統的穩定使用,同時也希望在下一個主版本釋出前,可以對新工具 / 新功能進行 開發 / 測試 / 研究 / 實驗。


RedHat 聽到了企業的聲音,推出了 Software Collections(SCL),SCL 包含了新的套件可供安裝,其中 Python3 的版本,目前更新到 3.6。



[root]# vi  /etc/yum.repos.d/CentOS-Base.repo

→ 找到 [extras]

→ 將 enabled 值改成 1

→ :x 存檔離開



[root]# yum  install  centos-release-scl



偷懶,安裝所有以 rh-python36 字首的套件  :-P


[root]# yum  install  rh-python36*



此時 Python2 與 Python3 是 並存 於 CentOS7 內的,這時若查詢系統預設執行的 Python 版本


[root]# python  --version


會回應顯示 python 2.7.5




若要以 Python3 執行,則要先下指令:


[root]# scl  enable  rh-python36  bash


再查詢一次


[root]# python  --version


這次就會回應 python 3.6.3


但因為 SCL  原意就是讓我們可以同時使用 Python2 和 Python3,所以當您 登出 或 重新開機,預設要執行的 Python 版本又會回到 2.7。



若要每一次登入,預設執行的 Python 版本都是 Python3,方法如下(不過 RedHat 也說這是解套方法,他們還沒想出正解):



建立 rh-python36.sh


[root]# vi /etc/profile.d/rh-python36.sh

 

#!/bin/bash

source  scl_source  enable  rh-python36

 

:x 存檔離開


登出系統,再重新登入


[root]# python  --version

系統就會回應


python 3.6.3




方法二:

Python3 會安裝在下述的路徑


/opt/rh/rh-python36/root/bin/python


在您撰寫的 python 程式的第一行指定要執行的 Python 直譯器


例如,您的程式名為 test.py

 

#!/opt/rh/rh-python36/root/bin/python

import sys

import platform


print(platform.python_version())

 


然後,變更 test.py 的屬性為可執行


[root]# chmod  a+x  test.py


這樣,您的程式會變成可執行檔


執行方式為:切換到 test.py 所在的目錄下,直接執行 test.py


[root]# ./test.py

2021年7月28日 星期三

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 "ou=xxxxx,o=xxxxx" -H ldap://1.1.1.1 -D "cn=xxxxx,o=xxxxx" -W "cn=xxxxx" | php /root/utf8ldif.php