顯示具有 伺服器管理 標籤的文章。 顯示所有文章
顯示具有 伺服器管理 標籤的文章。 顯示所有文章

2026年5月20日 星期三

你連的是哪一台MySQL?你連的MySQL真的是你要連的MySQL嗎?

 最近有一個任務。要把A主機的MySQL升版。問了幾個AI,方式差不多。想了幾天沒有問題就來試試。

結果一試沒有成主顧,但差點過世!

其實之前就有徵兆了。我有一個備份MySQL的程式,有一段時間沒有運作了。昨天看了一下是root密碼跑掉(其實這邊就很奇怪了),但我以為是我記錯,隨手處理掉。

升版方式很簡單:

1、下載mysql8的bin

2、備份舊版mysql資料

3、停止舊mysql

4、開新myqsl8

5、把舊mysql mysqldump出來的塞回mysql8

開始執行後好笑的事開始了。

1.我明明把舊mysql停掉了,但我怎麼連都是連到舊mysql

2.把舊mysql移除,但我怎麼連都是連到舊mysql

3.把mysql8跑在3308 port,連入的時候一直說某DB不存在 (這個是重大訊息,但我沒有想到跟後面的障礙有關)

4、透過HOST 127.0.0.1連3308 port,也是一樣某DB不存在。

我跟Gemini搞了很久,搞到我放棄。把舊db裝回去,先復原。

再試一次也是一樣,但這一次就直接裝在3308 port (舊db在3306 port不影響)。

查到最後發現只要 mysql --no-defaults -u root -p 就可以正常連到mysql8。

看來是default-db之類的參數有被設定。

經過多次測試之後,才想到我在 ~有設定 ./my.cnf 裡面有指定

server (B主機)/username/password/database。

當初是為了寫某個加密的script設定的,為了省功做的,登入的時候就不需要帳號密碼,過很久也忘了這件事。

所以,我從頭到尾都在備份B主機,連線B主機,回存B主機....

再回頭想,之前的備份失敗也是因為這個關係。

所以我回頭把那個加密程式改了一下,就不需要./my.cnf這個檔案了。

不過我剛再試一次mysql8還是沒有成功。因為我一開始mysqldump的時候dump出來的是B主機的資料(難怪我一直覺得奇怪,為什麼A跟B兩台主機備份出來是一樣大的檔案)。

看來這個問題應該是有解了.........應該吧


2023年12月8日 星期五

apache 2.4.52 to 2.4.57 another method

 


RHEL8本來只有支援apache 2.4.37,本來透過codeit.repo升到2.4.52,最近要升到2.4.57

(2.4.58要使用openssl 3.0以後的版本,是超大工程,因此就升到2.4.57)


以下講一下流程。

這一次自己編RPM檔來升版,本來以為會跟上次一次順利完成,但其實問題也不少,因此記錄一下。

cd /root/rpmbuild/SOURCES

rpmbuild -tb httpd-2.4.57.tar.bz2

記得先把相關設定檔備份好 (理論上yum會幫你備,但我的case他沒有備對,可能是我做過太多升版降版的測試的關係)

dnf localinstall httpd-2.4.57-1.x86_64.rpm httpd-manual-2.4.57-1.x86_64.rpm httpd-tools-2.4.57-1.x86_64.rpm mod_ssl-2.4.57-1.x86_64.rpm 

其它同時編譯出來的RPM檔就看你的需求。

倒回設定檔 (/etc/httpd/conf/httpd.conf)及其它的設定檔。這邊有一個問題。

我原先的2.4.52在讀取modules 是這樣讀的

Include conf.modules.d/*.conf

但升版後這個conf.moduels.d的目錄不見了。

所以我改回自己讀。

例如:

LoadModule mpm_prefork_module /usr/lib64/httpd/modules/mod_mpm_prefork.so

這邊預設是讀mod_mpm_event.so,會有MPM的錯誤訊息,所以我改讀mpm_prefork

我這邊用絕對目錄。如果要用相對目錄的話,

要調整以下的參數:

ServerRoot "/etc/httpd"


復原後發現PHP不能跑(因為httpd相依的php rpm被移掉了),回頭下載php-7.2.24-1.el8.x86_64.rpm

rpm2cpio php-7.2.24-1.el8.x86_64.rpm | cpio -idmv

取出libphp7.so搬到/usr/lib64/httpd/modules/


SSL的部份也一樣在升版時mod_ssl被刪除了,下載mod_ssl-2.4.58-1.el8.x86_64.rpm,取出mod_ssl.so

wget https://pkgs.dyn.su/el8/modular/x86_64/httpd/mod_ssl-2.4.58-1.el8.x86_64.rpm

rpm2cpio mod_ssl-2.4.58-1.el8.x86_64.rpm | cpio -idmv

放到/usr/lib64/httpd/modules/

再修改httpd.conf

LoadModule ssl_module /usr/lib64/httpd/modules/mod_ssl.so


這樣就差不多了。有開放使用者個人網頁的話,記得修改httpd.conf,新增:

LoadModule dir_module /usr/lib64/httpd/modules/mod_dir.so

LoadModule userdir_module /usr/lib64/httpd/modules/mod_userdir.so


有要跑cgi-bin的perl的話,記得修改httpd.conf,新增:

LoadModule cgid_module /usr/lib64/httpd/modules/mod_cgid.so


另外我的webgit也壞了,後來修改/etc/httpd/conf.d/gitweb.conf才跑出來。

有加#號的是原先的設定。

猜想是因為mod_fcgid.x86_64 : FastCGI interface module for Apache 2 這個模組也被刪掉的原因


Alias /git /var/www/git


<Directory /var/www/git>

  #Options +ExecCGI

  #AddHandler cgi-script .cgi

  #DirectoryIndex gitweb.cgi

  Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch

  AllowOverride All

  order allow,deny

  Allow from all

  AddHandler cgi-script cgi

  DirectoryIndex gitweb.cgi

</Directory>


另外在升版apache時,其實php-pear也被移掉了,但我好像只有之前測試multithread時有用到,因此就不裝回了。需要時再說吧。


本來由於設定檔沒有備到,打算降回2.4.52,但只能降到2.4.37(AppStream),而且設定檔也不會回來了。只好硬著頭往上升,

還好順利完成了。

後來才發現可以透過codeit升到apache 2.4.57,但同樣要解決php等幾個軟體的相容性問題。

但也記錄一下,可以看到有2.4.57及2.4.58的版本供選擇。

dnf module enable httpd:codeit

dnf module list httpd:codeit

dnf module info httpd:codeit

接著再用dnf或yum來處理。看的出來CodeIT確實有提供apache 2.4.57了

# yum --enablerepo=CodeIT info httpd

Updating Subscription Management repositories.

Unable to read consumer identity

Last metadata expiration check: 3:39:17 ago on Sun 10 Dec 2023 11:54:01 AM CST.

Installed Packages

Name         : httpd

Version      : 2.4.57

Release      : 1

Architecture : x86_64

Size         : 4.6 M

Source       : httpd-2.4.57-1.src.rpm

Repository   : @System

From repo    : @commandline

Summary      : Apache HTTP Server

URL          : http://httpd.apache.org/

License      : Apache License, Version 2.0

Description  : Apache is a powerful, full-featured, efficient, and freely-available

             : Web server. Apache is also the most popular Web server on the

             : Internet.




2023年8月14日 星期一

build apache http server 2.4.x rpm package on centos 7

目前系統上跑的是httpd-2.4.52,但在codeit上並沒有提供httpd-2.4.57讓我升版。

之前依習慣就自己下載tarball來編譯安裝,但這一次在做OpenSSH升版時想到可以用rpmbuild做rpm檔來裝。所以就想在httpd上也如法泡製。

1、下載檔案至rpmbuild的SOURCE目錄,我的目錄本來就有..可能之前就有玩過了..

為了保險,還是先做目錄:(先yum install rpm-build 然後還是要自己建目錄)

mkdir -p /root/rpmbuild/SOURCES

cd /root/rpmbuild/SOURCES

接著把檔案下載回來:

wget https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.bz2

2、把apr及apr-util的rpm裝起來

3、把該裝的東西補一補:
yum install autoconf libuuid-devel lua-devel libxml2-devel wget rpm-build autoconf zlib-devel libselinux-devel libuuid-devel pcre-devel openldap-devel lua-devel libxml2-devel  openssl-devel apr-devel postgresql-devel mysql-devel sqlite-devel  unixODBC-devel nss-devel expat-devel mailcap libtool gcc-toolset-11-gcc
4、來做RPM檔,如果過程中有錯誤訊息,應該就是有東西沒有裝到。
像我在nm卡了一下,才發現是gcc-toolset-11-gcc沒有裝。
rpmbuild -tb httpd-2.4.57.tar.bz2
5、把rpm檔裝起來:
cd /root/rpmbuild/RPMS/x86_64
dnf localinstall httpd-2.4.57-1.x86_64.rpm httpd-devel-2.4.57-1.x86_64.rpm httpd-manual-2.4.57-1.x86_64.rpm
這樣就好了。

其實他也是用tarball幫你編譯安裝,但好處是你不用再考慮路徑的問題。
例如我在用tarball安裝時,bin檔如果沒有指定目錄,會裝在/usr/local/bin,但用rpm安裝,就會在/usr/bin 這樣日後要移除或升版的話,在管理時會輕鬆很多。






OpenSSH更新心得 (after upgrade couldn't auto login server without password)

 OpenSSH有資安問題,建議更新。


好,我更新。

更新之後,發現本來可以auto login的設備都不通了。

簡單,public key更新就好。

更新後也不行。

看了一下debug訊息,不接受RSA?合理,改用ed25519。

欸,還是不行。

試了一個小時,好吧,我先換回舊版......

剛看了說明,似乎用RSA key 長度 2048 以上可以,但...我累了。改天吧 XD

 
補充一下:在client看到的錯誤訊息是這個:no mutual signature algorithm

有趣的是,在server用/usr/sbin/sshd -d -p 2222 再從client測試竟然看不到明顯的錯誤訊息。

最後還是還是解決了,其實在client這樣下就可以了:

ssh -o 'PubkeyAcceptedKeyTypes +ssh-rsa' myself@example.server.com

不過奇怪的是,在serer的sshd_config加PubkeyAcceptedKeyTypes +ssh-rsa 竟然沒有效...

原來是要在~/.ssh/config (只改該使用者) 或是在 /etc/ssh/ssh_config (改整台機器) 加上此設定才有效。

補充一下,用rpmbuild安裝輕鬆很多。
可以直接參考下文:
https://blog.csdn.net/m0_37682535/article/details/119254661

2023年6月28日 星期三

tarball 安裝apache-2.4.57及php-8.2.7

 工作所需,記一下參數(跟php7有很多的不同)


apache:

./configure --prefix=/usr/local/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-includedapr=/usr/local/apr/include/apr-1 --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

php:

./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs --with-zlib-dir --with-zlib --with-xsl --with-tidy --with-snmp --with-pdo-pgsql --with-pdo-mysql --with-openssl --with-mysqli --with-mhash --with-mcrypt --with-gmp --with-gettext --with-curl --with-bz2 --enable-sysvmsg --enable-sockets --enable-soap --enable-shmop --enable-pcntl --enable-mysqlnd --enable-mbstring --enable-ftp --enable-exif --enable-calendar --enable-bcmath --with-external-pcre --with-mysql-sock --with-external-libcrypt --with-jpeg --enable-gd --with-zip --enable-zts --with-freetype



2023年6月23日 星期五

讓PHP在HTTP下支援pcntl

最近工作上需要讓PHP在HTTP下支援pcntl。在cli的PHP是可以跑的,我也是先丟去cli處理。

但總覺得少了點什麼,於是試著讓它在http也可以跑。

弄了很久,因此記一下心得。

1、外掛so解法方式。

下載PHP tarball,在ext/pcntl下做phpize,就像這樣:

cd php-5.6.40/ext/pcntl

/usr/bin/phpize  ./configure --with-php-config=/usr/bin/php-config

./configure

make && make install

cd /usr/src/php-5.6.40/ext/pcntl

cp pcntl.so /usr/lib64/php-zts/modules/pcntl.so

cd php-zts.d/

vi 40-pcntl.ini

add this line:

extension=pcntl.so

apachectl

那個php-config試過不下沒有差,但加掛後不能執行。錯誤訊息是:

cat /var/log/php_errors.log

[22-Jun-2023 08:56:32 UTC] PHP Warning:  PHP Startup: Unable to load dynamic lib                        rary '/usr/lib64/php-zts/modules/pcntl.so' - /usr/lib64/php-zts/modules/pcntl.so : undefined symbol: executor_globals in Unknown on line 0

這個問題試了幾次都無法排除。因此換方法2。(其實也找不到怎麼解)

2、在自己編譯apache/php。
原先是在公司的電腦編,但太舊了編很久,後來在家裡的電腦裝vmware來編,快很多。然後才想起來我2019年也是這樣做的)
apache: ( httpd-2.4.57 )
./configure --prefix=/etc/httpd --enable-so --enable-ssl --enable-cgi \
--enable-rewrite --with-zlib --with-pcre \
--with-includedapr=/usr/local/apr/include/apr-1  \
--enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

make && make install 

在compile過程式,缺什麼就補什麼。
apr及apr-util要自己裝。

PHP: (5.6.40)
./configure --with-apxs2=/etc/httpd/bin/apxs --with-mysql --with-pdo-mysql --with-mysqli  --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif --enable-bcmath --with-bz2 --enable-calendar --with-curl  --enable-exif   --enable-ftp  --with-gd  --with-gettext  --with-gmp  --with-iconv-dir  --with-libxml-dir  --enable-mbstring  --with-mcrypt --with-mhash --with-mysql --with-mysqli --enable-mysqlnd --with-openssl --with-pcre-dir --enable-pcntl --with-pdo-mysql --with-pdo-pgsql --with-recode --enable-shmop --with-libxml-dir --with-snmp --enable-soap --enable-sockets --enable-sysvmsg --with-tidy --enable-wddx  --with-xsl --enable-zip --with-zlib --enable-maintainer-zts

因為有裝intl就要裝icu,但icu不管手動或系統自己的在PHP 在make時都不會過,最後索性不裝intl了 (intl是因為本來的PHP有,所以我才比照裝的)

另外由於我的apache有支援mpm,所以PHP就要enable zts。

然後一樣make && make install (make test會花很多時間,讓我重選我是不會去做的)

編完後,把檔案丟到server上取代原先的libphp5.so就好了 (舊的libphph5.so記得要備份)。
scp /usr/src/php-5.6.40/libs/libphp5.so 到伺服器的正確位置
在伺服器上apachectl應該就有了,用phpinfo看一下。

可惜還是失敗,看來要重新想辦法...

目前的錯誤訊息是:
PHP Fatal error:  Call to undefined function pcntl_fork()

似乎回到原點,但至少我知道哪些方法不可行了。

3、最後把方法1及方法2結合。
在vmware上編譯pnctl
cd /usr/src/php-5.6.40/ext/pcntl
phpize
./configure --with-php-config=/usr/local/bin/php-config --enable-pcntl
make 
make install
最後把modules/pnctl.so丟去伺服器上,終於搞定了。驗證如下:


接著我發現。他在網頁沒有辦法跑...那我這幾天是在忙什麼的 XD



2023年2月16日 星期四

DL380p Gen8 安裝ubuntu 22.04及hpasmcli 及異常log處理方式

之前陸續撿到幾台DL380p Gen8 ,依序裝了RHEL7,RHEL8都沒有問題。
但後來公司不買MA了,只好自力救濟,再加上RHEL8無法直接yum,於是決定棄用RHEL,改用Ubuntu。

要先說明的是在開機後,讀完BIOS後,HP的機器還會執行他們內建的管理介面:ILO,因此有很多的東西都是透過ILO與機器作溝通的。

最近這一台裝的是Ubuntu 22.04,遇到很多問題。記錄一下過程:
1、開機很久才讀安裝碟,看畫面是ILO4有異常log,但還是可以裝OS。最後為了省麻煩把ILO更新了,更新方法很簡單,他的ILO有網路孔,支援DHCP,讓它抓到IP,再透過網頁更新firmware就好了。這邊比較好笑的是,ILO web只支援tls 1.0,但目前(2023) 所有的瀏覽器都不支援tls 1.0了,唯一的只有IE,但IE在2/14不給用了。只好去調firfox的設定(或者也可以用ssh登入做升版,不過這部份我沒有試過。)

2、ubuntu 22.04原生支援DL380p Gen8的raid卡,因此安裝起來沒有什麼問題。但裝了ubuntu後一堆異常log,有兩種:
segfault at 28 ip 0000560378cdaa32 sp 00007fffc04f3420 error 4
另一種我沒有留,不過去查的話也是跟ILO相關。大概可以猜測是因為沒有裝ILO相關的套件造成的,但要找套件也是很麻煩的(因為Ubuntu 22.04之後apt-key使棄用,因此要花點時間研究,但排除後還是不能用apt安裝相關套件,最後直接去讀路徑,把相關的檔案下載後裝一裝就好了,但要裝的時候要小心,有部份套件是適用於gen10之後的機器。花了很多時間,才搞定,檔案是都放在這裡:https://downloads.linux.hpe.com/SDR/repo/mcp/Ubuntu/dists/jammy/12.50/non-free/


但好笑的是最後在解決其它問題的時候,發現檔案也有整合在其它方法,自行取用即可:
https://downloads.linux.hpe.com/SDR/repo/mcp/pool/non-free/
要稱讚HP一下,不需要註冊就大方的給檔案。

裝完相關套件之後,確實log少了很多。剩下的都是這種了:
hpilo Open could not dequeue a packet.
至少看的出來是hp裡的告警判讀問題。
但還是很多,因此我升版了ILO的firmware (其實我是到這個步驟才升的)
升完之後重開機,LOG就少了很一些。
但並非完全沒有。看起來是套件有少裝,所以他有部份的log無法解讀。所以我試著去裝hpasmcli 跟hplog 來查看log細項。它是在hp-health套件中,不算好找也不算難找,花了點時間,終於裝上了(記得要加force強制安裝,不然他會一直吐有少檔案的告警不給你裝),但一執行就....
ERROR: Could not open /dev/cpqhealth/cdt.
Please make sure the Health Monitor is started.

但這個好解決,裝上smartmontools,pciutils,dmidecode,真的不行就再裝ipmitool,就能解決了。

好棒棒,我們處理好了這些毛。但回頭一看RHEL8的機器也偶爾會吐Open could not dequeue a packet,也來處理一下。

RHEL8這邊的問題又不太一樣,因為他不提供hp-health的套件了。所以我們只能裝舊版的,但在尋找的過程中,發現在
https://downloads.linux.hpe.com/sdr/repo/spp-gen9/2021.10.0_supspp_rhel8.5_x86_64/

有新版本,裝了hp-health和他朋友就解決了。最麻煩的是RHEL7,什麼都試了就不行。最後發現裝上新版的hp-health就排除了。

過程如下,做過的蠢事太多了,不再一一說明了:

hpilo 0000:01:00.2: Open could not dequeue a packet


[root@saturn ilo]# hpasmcli

ERROR: Could not open /dev/cpqhealth/cdt.
Please make sure the Health Monitor is started.


yum install dmidecode

dmidecode -t bios

ERROR: Could not open /dev/cpqhealth/cdt.
Please make sure the Health Monitor is started.




more /proc/devices  | grep ipmidev
241 ipmidev


本來就有:
yum -y install smartmontools
yum install pciutils


新裝
yum install ipmitool

ipmitool sensor list

rhel8的機器到這裡就有效了。
ubuntu的機器我忘了,但印象大概也是到這一個步驟。

ERROR: Could not open /dev/cpqhealth/cdt.
Please make sure the Health Monitor is started.

ls -al /dev/cpqhealth/cdt
crw-r--r-- 1 root root 255, 178 Feb 17 14:07 /dev/cpqhealth/cdt



yum install mcelog
no use.

[root@saturn ilo]# rpm -ivh hp-ams-2.10.1-863.1.rhel7.x86_64.rpm
warning: hp-ams-2.10.1-863.1.rhel7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 26c2b797: NOKEY
error: Failed dependencies:
        lsof is needed by hp-ams-2.10.1-863.1.rhel7.x86_64


yum install lsof
rpm -ivh hp-ams-2.10.1-863.1.rhel7.x86_64.rpm
no use

systemctl restart hp-health.service
無效

安裝hponcfg,hp-snmp-agents, ssa-4.21,ssacli-4.21,ssaducli-4.21
也無效


hplog -v

rpm -e hp-health-10.50-1826.40.rhel7.x86_64
rpm -ivh hp-health-10.93-307.7.rhel7.x86_64.rpm

補充說明一下:(2023/02/18)
hp-health在repo沒有,所以你用apt install hp-health 會找不到。
所以我們把檔案下載下來安裝,但如果直接用
apt install ./hp-health_10.80-1874.10_amd64.deb
或用dpkg --install ./hp-health_10.80-1874.10_amd64.deb
會有相依性問題:
hp-health : Depends: libc6-i686 but it is not installable or
lib32gcc1 but it is not installable
E: Unable to correct problems, you have held broken packages.

所以我是這樣裝的:
dpkg --force-all --install ./hp-health_10.80-1874.10_amd64.deb
這樣安裝後,看起來一切都很美好,但在用apt安裝其它軟體時會要求你
apt-get install build-essential
這個指令一下,hp-health又會被移掉。

我本來想要自己找tarball自己編,但找不到。
所以最後是把deb解壓縮:
mkdir -p /tmp/hp-health
dpkg -x  hp-health_10.80-1874.10_amd64.deb /tmp/hp-health
再進到/tmp/hp-health的目錄中,手動把檔案放到定位。
drwxr-xr-x  4 root root 4096 Nov  2  2018 etc
drwxr-xr-x  3 root root 4096 Nov  2  2018 opt
drwxr-xr-x  2 root root 4096 Nov  2  2018 sbin
drwxr-xr-x  4 root root 4096 Nov  2  2018 usr
drwxr-xr-x  4 root root 4096 Nov  2  2018 var
其實他也很單純,手動移一移就好了。









2022年12月13日 星期二

wkhtmltopdf (wkhtmltoimage) 與openssl (libssl-dev)的衝突問題

 早上突然發現有一個報表很久沒有發了。它的作法是去查某網頁,若有更新就截圖寄給我。

看了一下是wkhtmltoimage在https的環境不能跑了。看了一下錯誤訊息,有一連串的這個:

QSslSocket: cannot resolve CRYPTO_num_locks

查了一下關鍵字,應該是我之前手動升版openssl造成的libssl-dev的路徑對不上的關係 (當時是為了玩ftps)

試著把libssl-dev重裝,無效。

找第三方的libssl來裝,也沒有效。

好吧,反正ftps沒有在用了,把openssl降版,也沒有效。

既然openssl的部份沒有解,就來解wkhtmltoimage的部份好了。

裝了新版的wkhtmltoimage,再執行它,它說glibcxx_3.4.21' not found。

看了libstdc++.so.6檔案的內容:strings libstdc++.so.6 | grep GLIBC

它確實沒有3.4.21這個版本。

原本已經打算手動更新gcc了。但在找相關檔案時發現,我之前在這機器上有裝docker。它有libstdc++.so.6.25,看了它的字串,它有GLIBC_3.4.21。

於是我就用libstdc++.so.6.25取代本來的libstdc++.so.6.19 (當然19版的我有保留下來,說不定又會有其它問題)。

接著再跑wkhtmltoimage。

OK,問題解決了。

2021年9月12日 星期日

如何使用vba下載郵件並上傳至伺服器

程式很簡單,監控outlook的郵件主旨,然後將符合主旨的附檔存下來(這部份很簡單就成功了,網路上很多可以參考的範例)。

一開始當然是要讓outlook可以使用開發者功能,才能寫VBA程式。


接著我們開始建立專案,把程式寫好。


最後就是建立規則,這邊的關鍵是要『執行程式碼』,不是『執行程式』。












接著把附檔丟到我的linux server上,然後linux server會去檢查檔案是否存在,在的話把它匯入資料庫。
要在outlook開發程式只能用vba,但vba要呼叫tftp一直時好時壞。難怪前輩們都是用scp或sftp....

這邊簡單補充一下,一般是用excel先做測試,先開啟開發者功能,然後允許巨集,接著插入一個模組,把程式丟到模組,就可以測試了。測試完成後,再回到outlook,用alt+F11就可以開啟VBA編輯介面(建議outlook也要開啟開發者功能並允許使用巨集),接著產生新的outlook規則,然後呼叫程式碼(我之前一直選成呼叫應用程式)

但在公司不管用tftp或scp都失敗。(有幾次成功,但...不穩定的東西誰敢用)
在家裡用tftp跟scp倒是都成功。
看來是tftp client的問題嗎或者環境問題嗎?在公司換了一個tftp client,結果輕易成功了。Windows 10預設的tftp.exe 可能在AD環境執行有一些權限限制吧?

附上簡單範例範例:
Sub uploadfile()
ChDir "D:\TEMP" ' Make "D:\TEMP" the current folder.
ChDrive "D" ' Make "D" the current drive.
Dim wsh As Object Set wsh = VBA.CreateObject("WScript.Shell") Dim waitOnReturn As Boolean: waitOnReturn = True Dim windowStyle As Integer: windowStyle = 1 wsh.Run "d:\temp\upload.bat", windowStyle, waitOnReturn
end Sub

upload.bat的內容如下:
cd d:\temp
d:
tftp.exe -i 192.168.1.2 PUT "my test.xlsx"
另外有幾個要特別留意的問題,在處理過程中比較常遇到的,雖然排除了但我沒有認真回頭去看哪些不需要。
1、vba shell timeout
2、vba shell path
3、vba dir & driver
4、vba shell mode and WScript.Shell
5、chr 34 and double quote (") , and """" & 總之就是雙引號之類的問題


2020年12月25日 星期五

開發系統時檔案的權限真的要注意

 剛犯了一個好笑的錯誤,記錄一下。

之前作了一個系統,原理很簡單:

1、上傳檔案

2、讀檔寫到DB以便作長期追蹤

3、用jpgraph畫圖

4、用PHPPresentation把圖作成簡報。

上週突然要加新的圖和說明文字。這個工作很簡單,網路上找張圖再塞進去。

但說也奇怪手動執行時該圖會出現在簡報上,但用上傳檔案介面時就是不會。

唯一的差異就是一個用我的帳號執行,一個用apache帳號執行。

難道會是PHP有問題嗎?

查了一下才想到,該不會是新抓的圖不給人讀吧。

回頭看一下,果然,新圖是700權限.....

2020年11月5日 星期四

PHP5 轉移至 PHP7需注意事項

 1、Too few arguments to function

PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function TABLE::__construct(), 0 passed in /home/www/OM/class/class.table.php on line 

10638 and exactly 1 expected in /home/www/OM/class/class.table.php:14

原因是PHP7比較嚴謹(我猜的),所以即使是空值也要給個null

public function __construct($var_cond) => $var_cond=null

大批修改如下:

vi 

%s/$var_cond)/$var_cond=null)/g


2、mysql_xxx to mysqli_xxx

所有mysql開頭的函式請改為mysqli開頭。但有兩個要特別注意的:

mysqli_query($sql, $conn); => mysqli_query($conn,$sql);

mysql_select_db('OM',$conn); => mysqli_select_db($conn,'OM');

這兩個mysql函式的順序跟mysqli相反,記得要調整。

3、PHP Warning:  preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead 

這個很明顯,改一下就好了。但callback似乎有比較多眉角,如果要做到沒有info或warning的話,要再調整一下。

4、PHP Deprecated:  __autoload() is deprecated, use spl_autoload_register() instead

這個也是改一下就好了

5、ereg及split相關函式

ereg() 可以用 preg_match() 替代

ereg_replace() 可以用 preg_replace() 替代

eregi() 用 preg_match() i 引數替代

eregi_replace() 用 preg_replace() i 引數替代

split() 用 preg_split() 替代

spliti() 用 preg_split() 模式 ‘i’ 替代

split -> explode

split -> 因為語法有用到regular expression要改用preg_split

6、iconv()要用mb_convert_encoding取代

7、PHP Deprecated:  Methods with the same name as their class will not be constructors in a future version of PHP

Replace

public function TSStatus($host, $queryPort)

with

public function __construct($host, $queryPort)

剩下的是環境問題:

1、php-fpm的log在/var/log/php-fpm/www-error,第一次用php-fpm的我不曉得。

2、Mariadb (MySQL)的錯誤訊息:Field `s_symptom` doesn‘t have a default value

要修改設定檔:

cd /etc/my.cnf.d

 vi mariadb-server.cnf

[mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

3、mysqlimport最後要加上--local



2020年10月21日 星期三

RHEL8 firewalld tftp problem 搞掉我一天的時間...

 


https://linuxhint.com/install_tftp_server_centos7/


搞了一整天,結果是OS bug...

簡單的來說 換了RHEL8之後tftp一直不能傳,看fw會有異常的unreachable - admin prohibited filter

disable firewalld就會好,但總不能一直這樣吧....

3.106310 wan1 -- 192.168.26.26.23814 -> 192.168..100.33.69: udp 26

3.114525 wan1 -- 192.168..100.33.43341 -> 192.168.26.26.23814: udp 4

3.114943 wan1 -- 192.168.26.26 -> 192.168..100.33: icmp: host 192.168.26.26 unreachable - admin prohibited filter

8.105289 wan1 -- 192.168.26.26.23814 -> 192.168..100.33.69: udp 26

8.113544 wan1 -- 192.168..100.33.43342 -> 192.168.26.26.23814: udp 4

8.113931 wan1 -- 192.168.26.26 -> 192.168..100.33: icmp: host 192.168.26.26 unreachable - admin prohibited filter


怎麼改規則,怎麼加port都沒有效的...

/bin/firewall-cmd --permanent --zone public --add-service tftp-client

firewall-cmd --reload


sudo firewall-cmd --permanent --add-port=69/udp

sudo firewall-cmd --zone=public --add-service=tftp --permanent

firewall-cmd --reload


2020年9月22日 星期二

重新產出ssh key時的注意事項 (for ssh2.php)

 今天把ssh key重新產出了。結果一堆程式不能跑,查了很久才想到,在用ssh2.php登入設備時,id_rsa及id_rsa.pub(這個檔應該不用,但懶得試了)也會用到。

因此如果重新把ssh key產生時,記得把這兩隻key也放到程式的目錄中。

2020年9月21日 星期一

ssh免密碼認證失敗的解決方法

 ssh免密碼認證應該算是基本功了。但我的新機器就是沒有辦法免密碼認證。

明明用其它帳號都正常,但就是我自己的帳號不行。

所以簡單講一下怎麼查:

1、先把firewall開好

sudo firewall-cmd --zone=public --permanent --add-port=2222/tcp

sudo firewall-cmd --reload

2、在server上開ssh debug

/usr/sbin/sshd -d -p 2222

3、從client去登入

ssh -p 2222 user@host

4、觀察debug:

debug1: trying public key file /home/klting/.ssh/authorized_keys debug1: fd 10 clearing O_NONBLOCK Authentication refused: bad ownership or modes for directory /home/klting

看的出來是/home/klting這個目錄的權限問題。

看了一下權限是750,可能是我之前測東西改到的,用chmod改回700就正常了。

5、記得關防火牆

sudo firewall-cmd --zone=public --permanent --remove-port=2222/tcp

sudo firewall-cmd --reload

最後確認一下目前防火牆開哪些port,確認有關成功

firewall-cmd --list-all




2020年9月4日 星期五

抓取設備資訊後直接寄mail (不先存成檔案)

有時候我們希望定時出報表,但又不希望還要另存新檔再寄送檔案。這個時候就是pipe上陣的時候了。

另外補充一點,在crontab中,%號前要加\,才能正常使用。

 5 14 * * 5 /home/klting/get_srx_spu.exp | egrep "Flow|curr|4 0|5 0|6 0" | mutt -s "srx spu check on $(date +\%Y-\%m-\%d)" klting@xxxx.com.tw

2019年10月16日 星期三

處理openssh相容性問題


最近把用了很多年的伺服器換掉,結果遇到一堆問題。先簡述一下:我有很多設備要管理,我們會定期用程式請這些設備吐設定檔回來。但在這一次更換server後,有部份機器吐不回來。

1、    先確認問題點。有這個問題的都是跑舊的OS的機器。
2、    我們用的是sftp,因此可以推測大概是加密方式(強度)之類的問題
3、    Log有分兩種,讓人意外的是新款的設備也無法正常連線
Oct 16 09:15:30 28.test.net.tw %SSH-3-ERROR: failed to authenticate admin enable
Oct 16 09:17:10 28.test.net.tw %SSH-3-ERROR: failed to authenticate admin !
192.168.230.56:Oct 16 09:16:23 56.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
192.168.230.81:Oct 16 09:16:20 81.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
192.168.230.82:Oct 16 09:16:19 81.test.net.tw %SSH-3-ERROR: key_verify failed for server_host_key
4、從log上看起來,我本來懷疑是設備的問題,還進了shell mode查了很久。看是不是能更新server_host_ke這個檔案來處理。但後來發現沒有這個檔案一樣可以正常運作,因此又回頭找伺服器的問題。
5、既然懷疑是伺服器的相容性問題。因此我作了很多調整。調cipher,調kex,調key (本來是懷疑伺服器用的加密方式太新,舊設備不支援,打算讓伺服器向下相容)。
6、試了很多參數都沒有效。因此只好調整伺服器的版本,最後找了一個相對沒有那麼舊的版本將tarball解壓編譯安裝後解決了。

以下是有問題的連線,server給了New Keys之後就被斷線了。




正常應該是這樣才對,server給了新key後,clinet與server間用新key加密傳資料
。

作一些筆記以後用:
以下是查詢目前ssh server支援(可使用)的加密方式、驗證方式。
ssh -Q cipher
ssh -Q mac
ssh -Q kex
ssh -Q key
用man 5 sshd_config這個指令也可以查看。

新版設備使用的加密方式:
cipher=aes128-ctr ksize=128 mac=hmac-sha1 pfs=diffie-hellman-group-exchange-sha256

舊版設備使用的加密方式:
cipher=3des-cbc ksize=192 mac=hmac-sha1 pfs=diffie-hellman-group1-sha1

不過我比對之後,openssh-server其實都有支援,因此在wireshark看起來也都能正常運作,只是不曉得為何給了新key後就斷了。

把LogLevel從INFO等級調整成VERBOSE  比較好查修   
LogLevel VERBOSE            

 cat /var/log/audit/audit.log | grep 192.168.18.12

你可以在sshd_config,告訴它說你只想使用哪些加密方式,可以指定Ciphers及MACs這些。至於HostKeyAlgorithms跟KexAlgorithms我測試在新版(OpenSSH 8.x是不支援的)。


另外,你在測試的時候可以用ssh -vv來查看在交握過程中出了什麼問題 (我的設備太舊不支援這個參數)

在domain中的電腦如何開啟Linux的Samba的網路芳鄰檔案共享服務

這個問題是老問題了,之前遇過一次。但沒有解決,這一次因為是換機器,避不開這個問題。只好想辦法解決。

我們先假設smb.conf的內容都是對的。這樣變數比較小,不過實際上,我們都是改改調調,也不能100%的相信它沒有問題,即使testparm跟你說他是好的我們總是會懷疑。但我們還是先相信它是對的吧。

我用的Samba是4.9.1-6.el7的版本。

第一個問題是,在domain中的電腦在登入linux的samba server時,會很貼心的幫你貼上 \domain\username的帳號。這樣當然是過不了的。
我之前有錄過封包,它真的會自動幫你補上domain名稱。

解決方法很簡單,帳號改成 .\username就好了。這樣的話。它就會用\pcname\username的方法登入。但我實測的結果還是不能登入。

第二個問題是,你的密碼是用什麼指令建立的,你建立的密碼真的有被讀進來嗎?之前都是用smbpasswd,有人說現在應該要用pdbedit了,但我實測的結果,如果你沒有去動smb.conf的話,它都是產生在passdb.tdb中(當然,所存在的目錄會依你使用的linux不同而有所差異)。

第三個問題是,你的電腦乾淨嗎?以我的例子而言,因為換了機器,但是IP沒有變,還是192.168.1.2。之前儲存的\\192.168.1.2自然是不能用了。

要清除連線記錄(快取)的話,方法有很多。
klist purge
control keymgr.dll
rundll32.exe keymgr.dll, KRShowKeyMgr
基本上我都會試一下,不過我覺得比較有用的是第三個。

第四個問題,還是沒有效。怎麼辦?

這個就真的很直得討論了,我找了很久,發現以下的方法是有效的。如果你還是不能解決,就試試吧。然後可以調整一下內容裡的東西試試。

以下是操作方式:
在執行輸入secpol.msc
接著左邊選單選『本機原則』,再選『安全性選項。』
然後在右邊找到『網路安全性:LAN Manager 驗證等級』
對他點兩行,開啟內容。然後改成『只傳送NTLM v2 回應』

以下是可能的選項:
  • 傳送 LM & NTLM 回應
  • 傳送 LM & NTLM-如果交涉使用 NTLMv2 工作階段安全性 (這個是我的預設值)
  • 將 NTLM 回應只傳送
  • 傳送只 NTLMv2 回應
  • 只傳送 NTLMv2 回應。 拒絕 LM
  • 只傳送 NTLMv2 回應。 拒絕 LM & NTLM
  • 未定義
(這個是微軟機翻的版本),英文的部份是

Possible values

  • Send LM & NTLM responses
  • Send LM & NTLM - use NTLMv2 session security if negotiated
  • Send NTLM responses only
  • Send NTLMv2 responses only
  • Send NTLMv2 responses only. Refuse LM
  • Send NTLMv2 responses only. Refuse LM & NTLM
  • Not Defined


以上報告完畢。希望之後不會再花這麼多的時間作測試。

後記,由於同事需要上內部公文系統,如果修改成為NTLM V2 only會不能執行,因此我查詢了smb.conf的說明後,新增以下設定:

ntlm auth = true
讓它支援NTLM V1,降低了一點安全性。

所以結論就是,Samba 4.x為了安全性,強制用戶一定要用NTLM V2。我們可以透過修改設定檔的方法增加其相容性。



2019年8月11日 星期日

CentOS 移植心得 (Apache & PHP版本問題)

原主機是 apache 2.2+ PHP 5.4.17是用rpm裝的。新的主機是CentOS 6,懶得重裝成 CentOS 7。就打算把PHP升版,順便把apache升成2.4版。本來打算讓YUM搞定所有事,但不太順利,最後還是手動編譯tarball搞定了。

PHP要升版很容易,透過remi來升就好了。網路上教學很多。
但我升完用yum搜尋會有兩種檔案,一種是php56開頭的,另一種是php開頭後面是56的。看了一下檔案大小確實有差異,我也懶得去認真研究其差異(猜想後來yum預設的PHP也變成5.6了)。我一開始兩種都有保留,希望php56的可以直接讓apache2.4用(因為它會產出libphp5.so這個檔案)。但弄到最後沒有辦法解決問題,最後還是把php56開頭的都移除了。

接著要處理apache 2.4的問題,rhel可以升,但升完之後不支援PHP。而且路徑名稱我很不喜歡,我也不想用link的方式來解,這個網路上也有一些教學。安裝完成後我試著裝了php56開頭的檔案 但怎麼弄都是以下錯誤:
httpd: Syntax error on line 163 of httpd.conf: Cannot load modules/libphp5.so into server: modules/libphp5.so: undefined symbol: unixd_config

這個是因為apache 2.4之後function name有變的關係。

試了幾天,看來這個方法不行 於是我自己下載了php5來編譯,但結果相同。鼻子摸一摸,連apache 24也自己編譯。(最後發現也許是我在httpd.conf沒有先disable php5 module的關係,但發現時已經太晚了)

我先把apache 2.2及php 56開頭的rpm都移除。(但我沒有移除掉php開頭的檔案),我的計畫是php 56編譯後只用它產出的SO檔給apache用。其它CLI的不動。

接著下載apahce 2.4編譯 (要先編譯安裝apr及apr-util),原先aprapr及apr-util的版本太舊,因此我有將之移除,並以預設值編譯安裝。

apache 2.4的編譯指令如下供參考:
./configure --prefix=/etc/httpd --enable-so --enable-ssl --enable-cgi \
--enable-rewrite --with-zlib --with-pcre \
--with-includedapr=/usr/local/apr/include/apr-1  \
--enable-modules=most --enable-mpms-shared=all --with-mpm=prefork


安裝後再回頭下載php 5.6.40,解壓編譯它,mysql的部份是後來重編的,因為啟用PHP之後發現PHP 不認識它們家三兄弟......

./configure --with-apxs2=/etc/httpd/bin/apxs \
--with-mysql --with-pdo-mysql --with-mysqli  --with-libxml-dir --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir \
--with-zlib-dir --with-bz2 --with-openssl --with-mcrypt --enable-soap \
--enable-gd-native-ttf --enable-mbstring --enable-sockets --enable-exif

重點就是mysqli還有apxs的那一段,你其實也可以在編譯apache2的時讓它用unixd_config,但你都要用新的版本了,何苦再讓它支援舊指令。

完成後把so檔丟到apache的modules目標中。
cp /usr/src/php-5.6.40/libs/libphp5.so /etc/httpd/modules/

再編輯httpd.conf
加入以下兩行:
LoadModule php5_module modules/libphp5.so
IncludeOptional conf.d/*.conf

接著在conf.d目錄中,新增php.confA
 其內容是:

   
        Require all denied
   
   
        Order allow,deny
        Deny from all
        Satisfy All
   

AddType text/html .php
DirectoryIndex index.php

   
        SetHandler application/x-httpd-php
   
    php_value session.save_handler "files"
    php_value session.save_path    "/var/lib/php/session"
    php_value soap.wsdl_cache_dir  "/var/lib/php/wsdlcache"



最後再重啟apahe就好了。


x
x

CentOS 移植心得 (SAML & PHP版本問題)

這邊快乾死了,來澆點水。

最近在做幾件事,第一件是把 Ubuntu 14.04上同事開發的系統移植到CentOS 7上。

一開始在SAML(SSO)卡了很久。實在沒有辦法去認真研究了一下它的架構,最後發現在
/var/simplesamlphp/metadata
裡面的
saml20-sp-remote.php
要新增以下內容
$metadata['http://10.100.32.31/sso/module.php/saml/sp/metadata.php/default-sp'] = array (
  'AssertionConsumerService' => 'http://10.100.32.31/sso/module.php/saml/sp/saml2-acs.php/default-sp',
  'SingleLogoutService' => 'http://10.100.32.31/sso/module.php/saml/sp/saml2-logout.php/default-sp',

);

我原以為這樣就解決了。但系統移過去就是沒有畫面。在log檔沒有任何一個字的錯誤訊息,就這樣抓了三週。幾乎把所有我想過的方法都試過了。

後來有一天早上我福至心靈,把副程式的log都開起來(本來只有開主程式,沒有想到副程式裡的log都被關掉)才發現是empty這個函數在不同的PHP版本有不同的處理方式。

Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false.

我的舊主機是PHP 5.5.9,新的主機是5.4。所以才會遇到這個問題。

最後把PHP升版後終於解決了。

2019年5月8日 星期三

FreeBSD syslog只存檔不吐log至其它server的解法

syslog.conf的內容長這樣:
local0.*                                        /var/log/firewall/ipf.log
local0.*                                        @66.66.66.69

理論上應該會丟syslog到66.66.66.69。
但就是不會吐。

找了很久,發現在rc.local中,ipmon的設定如下。看起來沒有什麼問題。但就是不丟syslog到其它server。
/sbin/ipmon -D /var/log/firewall/ipf.log

後來發現要改成這樣:
/sbin/ipmon -D -s

-s代表syslog優先於存檔