2024年9月27日 星期五

tiptop 環境登入設定

 1. $HOME/.profile

</u1/usr/tiptop> cat .profile
#echo "?D?i?U?u§@Ao1O (1)¥?|!°I (2)’u﹐O°I (3)?D·C°I *) Exit  [1]:\c"
echo "請選擇工作環境 (1)正式區 (2)測試區 (3)標準區 *) Exit  [1]:\c"
echo ""
read ans
case $ans in
  1) . /u1/usr/profile/profile.topprod
     ;;
  2) . /u1/usr/profile/profile.toptest
     ;;
  3) . /u1/usr/profile/profile.topstd
     ;;
  *) exit
     ;;
esac

2. 根據選取,讀檔

資料庫設定在選取的檔案內,如 /u1/usr/profile/profile.topprod
環境變數在這裡的檔案設定
例如,$FGLPROFILE就是在這裡設定,然後tiptop程式會呼叫環境變數來讀取資料庫設定

##########################################################################

另外,一般user,
1. default directory 在/etc/passwd 設定為/u1/usr/topgui
2. /u1/usr/topgui/.profile 裡面會直接執行udm7

[root@tiptop ~]# cat /u1/usr/topgui/.profile
. /u1/usr/profile/profile.topprod.udm7
exit

所以一般user在linux shell 下,su 過去時,就會直接開啟GUI

2024年9月25日 星期三

舊 Linux Server 使用者帳號轉移到新 Server

https://junhanli.blogspot.com/2016/07/linux-server-server.html

 在遇到Linux Server要移轉或者作備援機時,需要連同用者帳號一同移轉,移轉的步驟如下:

一、會影響到的舊Server的檔案:

/etc/passwd – 內含帳號資訊, 如家目錄, shell 等
/etc/shadow – 內含帳號加密的密碼
/etc/group – 定義用戶群組
/etc/gshadow – 內含群組加密資訊
/home – 用戶預設的家目錄


二、先在舊Server本機上做備份


1.mkdir /root/move
2.export UGIDLIMIT=500   只要移轉uid500以上的使用者帳號
3.awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534)' /etc/passwd > /root/backup/passwd.mig  
複製使用者帳號
4.awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534)' /etc/group > /root/backup/group.mig  
複製群組帳號
5.awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534) {print $1}' /etc/passwd | tee - |egrep -f - /etc/shadow > /root/backup/shadow.mig  
複製/etc/shadow
6.cp /etc/gshadow /root/backup/gshadow.mig  複製/etc/gshadow
7.tar -zcvpf /root/backup/home.tar.gz /home  備份/home

三、在新的Server上將使用者帳號作備份
1.mkdir /root/oldusers.bak
2. cp /etc/passwd /etc/shadow /etc/group /etc/gshadow /root/oldusers.bak   將新機使用者及群組帳號檔備份
3. 將舊帳號加入新機帳號檔
# cat passwd.mig >> /etc/passwd  
#
cat group.mig >> /etc/group
# cat shadow.mig >> /etc/shadow
# /bin/cp gshadow.mig /etc/gshadow 
 
上面必須用雙箭頭 ">>", 不能用單箭頭 ">", 如果用單箭頭的話會將新 Server 的系統帳號刪除。

四、將 home.tar.gz複製及解壓縮至新Server的/home
# cd /
# tar -zxvf /path/to/location/home.tar.gz

2024年9月12日 星期四

Genero連結資料庫

 https://ithelp.ithome.com.tw/m/articles/10259775

既然是從 INFORMIX 剝離出來的工具,應該連結資料庫的能力是強大的。本段落我們檢視一下Genero連結資料庫的能力。

市面上常用的資料庫,都有自己努力的強項,個別的指令也稍微有些不同。為了最大化能共通於這些資料庫,以做到『Write Once, Use Everywhere』,Genero FGL具有自開發的『共通性資料庫介面 ODI, Open Database Interface』,以 INFORMIX 指令為基準 (因為來自於 INFOMIX ),將其他資料庫具有的些微差異,利用 ODI 進行轉譯,概略流程如下:
https://ithelp.ithome.com.tw/upload/images/20210903/20051169moOCaveFDG.png
透過 ODI 的轉換,資料庫內包含數據型態、SQL語法、指令等,能在最大限度下求同,但仍舊保持了使用 PREPARE 方法,使得特殊指令仍在 Genero內能被使用,滿足『優化』的需求,此為存異。

FGLPROFILE

FGL套件的設定檔案是 FGLPROFILE,在這裡可以指定許多必要的設定,今天專門針對『資料庫的連線』進行說明。

FGLPORIFLE採用 entry 的方式設定 (非INI模式),行首 # 字號時代表為註解

  • dbi.default.driver = "" #預設連結的 db 種類驅動程式,安裝時有詢問就會補上
    此設定可以參考 $FGLDIR/dbdrivers 路徑下設定,若為 ORACLE 則通常為 dbmora (注意部分Genero須帶版號)
  • dbi.database..X #指定資料庫連線字串, 可隨產品需求自行定義,X 則是設定帳號密碼等訊息,不同資料庫列出差異於下方

Genero各版本可對接的數據庫

Genero可對接 IBM DB2 / INFORMIX / MS SQL Server / ORACLE / MySQL / PostgreSQL / SAP Hana / SQLite / Sybase ASE (以上按照名稱排序),但是支持版本各有不同,以下挑選部分資料庫作為簡介對象

資料庫廠牌 Genero 2.40 Genero 2.50 Genero 3.20
ORACLE 8.x / 9.x / 10.x / 11.x 9.2 / 10.x / 11.x / 12x 11.x 以上全版本
INFORMIX 5.x / 7.x / 8.x / 9.x / 10.x / 11.x 5.x / 7.x / 8.x / 9.x / 10.x / 11.x 5.x以上全版本
MS SQL Server 2005 / 2008 / 2012 2005 / 2008 / 2012 2012以上全版本,Azure SQDBL V12
PostgreSQL 8.x.y / 9.x.y 8.x.y / 9.x.y 9.6 / 10 / 11 / 12
SQLite 3.5.x / 3.6.x 3.5.x / 3.6.x 3.x

Genero端連線方法

連線到資料庫時,最重要的就是連線字串的設定。包含連結的資料庫主機位置 (port) 、登入資料庫的帳號密碼,以及對應需使用的字元組等環境變數。
^ 例如 ORACLE 資料庫會將相關訊息以 ORACLE_SID 含括成為一組設定時,則須依照該資料庫要求進行設定。

使用靜態的 FGLPROFILE 設定

Genero支持靜態的設定檔,即透過 FGLPROFILE 進行連線字串的設定。FGLPROFILE的存放有兩組路徑:$FGLDIR/etc/fglprofile 與 $FGLPROFILE 指定檔案,遇有同樣的設定時,後者可壓過前者;同檔案內衝突時,下方設定壓過上方設定

使用動態的 CONNECT 指令設定

若需要連結的資料庫眾多,或是需要動態設定,則可以在程式內部使用 CONNECT 指令
語法
『CONNECT TO連線對象+ODI驅動程式名稱 USER 連線帳號 USING 連線密碼』
註:連線對象依照不同資料庫有不同需求。部分資料庫如SQLite無帳號密碼則可省略

以下將以 Genero 3.20 為例說明個別資料庫連線注意事項

本文摘錄需特別關注要點進行說明與介紹,需大量採用或作為生產環境時,仍應詳讀FGL的ODI文件,該文件內均會詳列連線時,DB的特殊之處、須採用的特殊語法、如何將原有程式或查詢語句進行轉換為 ODI 通用語句。

ORACLE

連線前

需在 Genero 所在主機安裝完成對應的 ORACLE Client 軟件,並配置 tnsname.ora,確認ORACLE_SID / ORACLE_HOME 等必須存在的環境變數時,可進行 Genero 端設定

FGLPROFILE設定
dbi.database.dbname.driver = "dbmora"
dbi.database.dbname.source = "stock"
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"
dbi.database.dbname.schema= "登入SCHEMA"

INFORMIX

連線前

驅動程式配置完成後,需確認 INFORMIXSERVER 環境變數是否已完成配置

因為源自於 INFORMIX,所以在 FGLPROFILE 中指定驅動程式即可

PostgreSQL

連線前

需安裝好client,且必須完成下列環境變數的設定

  • PGHOST PostgerSQL資料庫所在IP/Domain
  • PGPORT PostgreSQL資料庫需要通信埠 (預設為5431可在db端新增額外區或調整)
  • PGDATABASE 預期要使用的database
  • PGHOME 若DB與Genero裝在同一台時,指向PostgreSQL安裝路徑用的
  • PGLOCALDIR 若DB與Genero裝在同一台時,指向語系檔用的
  • PGDATA 若DB與Genero裝在同一台時,指向data file存放路徑
FGLPROFILE設定
dbi.database.dbname.driver = "dbmpgs"
dbi.database.dbname.source = "test1"   #或用dbname[@host[:port]]
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"

MS SQL Server

連線前

SQL Server在2.40與更早前的版本,有支持 open source的FREETDS與Easysoft 的連線,此兩種連線需透過 OPEN ODBC的協助。設定上較為繁雜且軟件為社群維護,可能會有維護窗口的顧慮。可考慮直接使用微軟推出的 Linux 版本SQL Server驅動 SNC (SQLserver Native Client) 。
依據 Genero 官網要求,SQL Server連線前應先確定 Linux 上是否已完成對應驅動程式安裝的最低版本要求如下

FGLPROFILE設定
dbi.database.dbname.driver = "dbmsnc"
dbi.database.dbname.source = "test1"
dbi.database.dbname.username= "登入帳號"
dbi.database.dbname.password= "登入密碼"

SQLite

連線前

單機文件型資料庫,只需確認套件已安裝即可

FGLPROFILE設定
dbi.database.dbname.driver = "dbmsqt"
dbi.database.dbname.source = "/opt/myapp/stock.dbs"

若完成FGLPROFILE的設定後,即可令程式進行連線

要驗證連線時,可先利用 DATABASE 指令進行連線,依據上方的FGLPROFILE設定,以『dbname』為範例,測試連線如下

MAIN
   DEFINE cnt INTEGER
   DATABASE dbname
   SELECT COUNT(1) INTO cnt FROM hello_table 
   IF cnt > 0 THEN
     DISPLAY “CONNECT OK!”
   END IF
END MAIN

即可確認 DB連線成功。

 

2024年9月11日 星期三

VirtualBox重設硬碟大小

 https://tech.digitgeek.net/t/199.html

 

VirtualBox重設硬碟大小

改變VirtualBox硬碟大小按下列步驟執行:

(1)VirtualBox 虛擬PC關機狀態

(2)使用系統管理者的身分來開啟"cmd"

(3)在命令提示視窗切換VirtualBox安裝目錄,例如: C:\Program Files\Oracle\VirtualBox

(4)使用指令" VBoxManage modifyhd "修改vdi硬碟大小

例如:想將虛擬硬碟修改成40GB

VBoxManage modifyhd C:\Users\USER\Desktop\WINS2019\WINS2019.vdi -–resize 40960

(5)執行後,虛擬硬碟就被修改為40GB

(6)虛擬PC開機進入系統
到"系統管理工具"==>"電腦管理"

將滑鼠移至舊的分割區C:,按右鍵,選取"延伸磁碟區"(見圖2)

進入後如圖4,直接按"下一步",即可完成,如圖5

到此即完成修改硬碟大小及增加C槽大小的任務

[圖1]

[圖2]

[圖3]

[圖4]

[圖5]

 

 

Ubuntu Linux 檔案系統擴充邏輯分割區

 https://www.concerto.one/posts/2021-09-28-Extend-Ubuntu-Linux-Volume.html

 

【運維管理】Ubuntu Linux 檔案系統擴充邏輯分割區

虛擬機更動磁區的實體大小之外,還需要追加擴充邏輯磁區,才能百分百將所有的實體磁碟空間納入儲存用途

虛擬機的設置中,僅更動硬碟的容量是不夠的

首先觀察虛擬機的硬碟 8G,執行 lsblk 檢查磁區的紀錄看起來如下。

[root@ubuntu]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0     0  8G   0  disk 
└─sda1        8:1     0  1M   0  part 
└─sda2        8:2     0  1G   0  part /boot
└─sda3        8:3     0  7G   0  part
  └─u-vg-lv   253:0   0  7G   0  lvm  /

接著,將虛擬機硬碟從 8G 更改至 16G 時,會發現 lsblk 檢查磁區的紀錄與前述相同,沒有反應出更動後新的變化。

執行 df -hT 會發現可用的儲存空間依然只有 4.4G,與原來完全相同。

[root@ubuntu]$ df -hT
Filesystem          Size  Used Avail Use% Mounted on
...
/dev/mapper/u-vg-lv 6.9G  2.2G 4.4G  34%  /
...

根據 lsblk 顯示的磁碟設備名稱與分割區位置來更改磁碟容量

從前述執行 lsblk 可以得知,我們要擴充分割區的磁碟名稱為 sda ,而分割區位置在第三個。所以構成的 growpart 參數如下。

[root@ubuntu]$ sudo growpart /dev/sda 3

再一次執行 lsblk 將會看到設備 sda 磁碟的尺寸從 8G 變成 16 G。但是邏輯分割區 u-vg-lv 依然是 7G。

[root@ubuntu]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0     0  16G  0  disk 
└─sda1        8:1     0  1M   0  part 
└─sda2        8:2     0  1G   0  part /boot
└─sda3        8:3     0  15G  0  part
  └─u-vg-lv   253:0   0  7G   0  lvm  /

擴充邏輯分割區將所有空間納入檔案系統

執行 pvs,根據顯示的結果,可以看出需要更動的磁碟名稱是 /dev/sda3。所以擴充設備分割區的指令如下。

sudo pvs
sudo pvresize /dev/sda3

接著擴充邏輯分割區的檔案系統。u-vg-lv 是掛載在磁碟設備 /dev/sda3 上邏輯分割區的名稱。

lvextend -r -l +100%FREE /dev/mapper/u-vg-lv

再一次執行 lsblk 檢查 lvextend 的執行結果。可以看到邏輯分割區 u-vg-lv 從原來的 7G 變成 15G。

[root@ubuntu]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0     0  16G  0  disk 
└─sda1        8:1     0  1M   0  part 
└─sda2        8:2     0  1G   0  part /boot
└─sda3        8:3     0  15G  0  part
  └─u-vg-lv   253:0   0  15G  0  lvm  /

2024年9月6日 星期五

查看so文件架构 so文件怎么查看

 https://blog.51cto.com/u_16213724/7325973

ldd命令

linux 下可以使用ldd查看可执行文件所需要的动态链接库(*.so)。
注:下文用so代替动态链接库文件。

// 举个例子
~$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffe06386000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fd686b54000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd68678b000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fd68651a000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd686316000)
    /lib64/ld-linux-x86-64.so.2 (0x0000563411315000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd6860f9000)

问题

如果ldd命令没有找到对应的共享库文件和其具体位置?

可能是两种情况引起的:

1)共享库没有安装在该系统中;

2)共享库保存在/etc/ld.so.conf文件列出的搜索路径之外的位置。

通常情况下,许多开源代码的程序或函数库都会默认将在即安装到/usr/local目录下的相应位置(如:/usr/local/bin 或 /usr/local/lib)以便于系统自身的程序或函数库相区别。而许多linux系统的/ect/ld.so.conf 文件中默认又不包含 /usr/local/lib 。因此出现安装了共享库,但是却无法找到共享库的情况。

解决办法:
检查/etc/ld.so.conf文件,如果其中缺少/usr/local/lib 目录,就添加进去;
注意:在修改了/etc/ld.so.conf 文件或者在系统中安装了新的函数库之后,需要运行命令 ldconfig ,该命令用来刷新系统的共享库缓存,即 /etc/ld.so.cache 文件。为了减少共享库系统的库搜索时间,共享库系统维护了一个共享库so名称的缓存文件 /etc/ld.so.cache 。 因此,在安装新的共享库之后,一定要运行 ldconfig刷新该缓存。

Ubuntu 安裝 Python 3.12.3 + OpenSSL (openssl-3.3.2.tar.gz)

安裝OpenSSL
1. https://openssl-library.org/source/index.html 下載 OpenSSL source code (wget ...)
2. ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared (因為Python安裝時,只會吃ssl底下的目錄)
3.make; make test; sudo make install
4.
echo "/usr/local/ssl/lib64" > /etc/ld.so.conf.d/openssl.conf
5.sudo
ldconfig -v

安裝Python
1.(應該是需要這些)
  sudo apt-get install libbz2-dev
  sudo apt-get install libctypes-dev
  sudo apt-get install libffi-dev
  sudo apt-get install libncurses-dev
  sudo apt install libgdbm-compat-dev
  sudo apt-get install lzma
  sudo apt-get install liblzma-dev
  sudo apt-get install uuid-dev lzma-dev liblzma-dev
  sudo apt-get install nis
  sudo apt-get install libnsl2 libnss-nis
  sudo apt-get install libncurses5-dev
  sudo apt-get install libncurses-dev
  sudo apt-get install libreadline-dev
  sudo apt-get install nis
  sudo apt-get install tk
  sudo apt-get install tk-devel
  sudo apt-get install tk*dev
  sudo apt-get install nis
  sudo apt-get install libnsl-dev libnsl2
  sudo apt-get install libsqlite3-dev
  sudo apt install libssl*dev
或者
sudo apt-get update sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev git

2. ../configure --enable-optimizations --with-openssl=/usr/local/ssl --with-ensurepip=install --with-openssl-rpath=/usr/local/ssl/lib64/

3. vim configure

Change

OPENSSL_LDFLAGS=-L/usr/local/ssl/lib

To:

OPENSSL_LDFLAGS=-L/usr/local/ssl/lib64

4. make -j$(nproc) ; sudo make altinstall

這裡可以找到 firefox 較舊的版本喊所屬OS平台

 https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/?_gl=1*114952f*_ga*NDQ0MjQ3MDMzLjE2NjkzNjAwNzQ.*_ga_2VC139B3XV*MTcyNTYxMDg5Ni4xMC4wLjE3MjU2MTA4OTYuMC4wLjA.

如果是linux,
1. 解壓縮,將目錄後放到 /usr/lib/ 之下,形成 /usr/lib/firefox,
2. 並下sudo ln -s /usr/lib/firefox /usr/bin/firefox 指令就可以了

2024年9月5日 星期四

Ubuntu sqlpus 啟動會報錯 sqlplus: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

$ sudo apt install libaio1 libaio-dev
$ sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1

Ubuntu 的library 和CentOS 名稱不太一樣...沒辦法

2024年9月4日 星期三

使用Python 寫爬蟲範例

############################ ubuntu ############################
$ sudo apt install python3-pip
$ sudo apt install python3-selenium
$ sudo apt install python3-bs4
$ sudo apt install python3-requests
$ sudo apt install xvfb
$ export DISPLAY=:99
$ Xvfb :99 -screen 0 1024x768x16 &

############################ fedora ############################
$ sudo yum install python3-pip
$ sudo pip3 install selenium
$ Xvfb :99 -screen 0 1024x768x16 &sudo pip3 install bs4


$ wget https://github.com/mozilla/geckodriver/releases/download/v0.35.0/geckodriver-v0.35.0-linux64.tar.gz
$ tar xvf geckodriver-v0.35.0-linux64.tar.gz
$ sudo cp geckodriver /usr/local/bin/

$ cat get_fedex.py
#!/usr/bin/python3

# 載入需要的套件
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
from selenium.webdriver.firefox.service import Service
import requests
import time

# 開啟瀏覽器視窗(Chrome)# 方法一:執行前需開啟chromedriver.exe且與執行檔在同一個工作目錄
#driver = webdriver.Chrome()
#service = Service(executable_path='/usr/local/bin/geckodriver')
service = Service('/usr/local/bin/geckodriver')
driver = webdriver.Firefox(service=service)
#driver = webdriver.Firefox()

# 方法二:或是直接指定exe檔案路徑
#driver = webdriver.Firefox("/usr/local/bin")

driver.implicitly_wait(3) #等10秒,讓網頁資料load進來
driver.get("https://www.fedex.com/zh-tw/shipping/surcharges.html") # 更改網址以前往不同網頁
#time.sleep(100)

#driver.find_elements(By.CLASS_NAME,"fxg-gdpr__accept-all-btn cc-aem-c-button cc-aem-c-button--responsive cc-aem-c-button--primary")[0].click()
#buttons=driver.find_elements(By.CLASS_NAME,"fxg-gdpr__accept-all-btn cc-aem-c-button cc-aem-c-button--responsive cc-aem-c-button--primary")

button=driver.find_elements(By.CSS_SELECTOR,".fxg-gdpr__accept-all-btn")[0] #使用Selenium IDE找出來 "accept all cookie" 的按鈕
print(button)
button.click()

driver.refresh() #接受cookie後,要將網頁refresh, 重load資料

#使用Selenium IDE找出來要抓資料
data=driver.find_elements(By.CSS_SELECTOR,".fuelsurcharg-dynamic-datalookup .cc-aem-c-table__tbody:nth-child(2) .cc-aem-c-table__tbody__td:nth-child(1)")[0]
print(data.get_attribute("innerText"))
data=driver.find_elements(By.CSS_SELECTOR,".fuelsurcharg-dynamic-datalookup .cc-aem-c-table__tbody:nth-child(2) .cc-aem-c-table__tbody__td:nth-child(2)")[0]
print(data.get_attribute("innerText"))
data=driver.find_elements(By.CSS_SELECTOR,".fuelsurcharg-dynamic-datalookup .cc-aem-c-table__tbody:nth-child(2) .cc-aem-c-table__tbody__td:nth-child(3)")[0]
print(data.get_attribute("innerText"))

#print (driver.title)
#html=driver.page_source
#print (html)

#soup = BeautifulSoup(driver.page_source, 'lxml')
#print(soup.prettify())
#
#with open('index.html', 'w', encoding='utf-8',) as file:
#    file.write(soup.prettify())

driver.close() # 關閉瀏覽器視窗