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後,clinetserver間用新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後就斷了。

LogLevelINFO等級調整成VERBOSE  比較好查修   
LogLevel VERBOSE            

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

你可以在sshd_config,告訴它說你只想使用哪些加密方式,可以指定CiphersMACs這些。至於HostKeyAlgorithmsKexAlgorithms我測試在新版(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月27日 星期二

20190820~20190827 日本山陽旅記

 20190820~20190827 日本關西山陽旅記(廣島 岡山 倉敷 兵庫 京都)

前言:這一次是坐JR,所以買了兩張票卷:JR關西&廣島地區鐵路周遊券、JR關西廣域鐵路周遊券

景點:廣島、宮島、姬鹿、岡山、倉敷美觀、京都鐵博館、天橋立、伊根舟屋、京都貴船神社、平安神宮、晴明神社。



0820 高雄 → 廣島

這一次是坐樂桃,讓家人體驗一下沒有空橋的感覺。結果過了幾年問大家,只有我有印象...人類的記憶力是不可靠的 XD


關西機場的第二航廈是樂桃專屬的,要坐接駁電車通往第一航廈,再坐haruka (使用JR關西&廣島地區鐵路周遊券)。到新大阪再轉新幹線往廣島。在新大阪買了晚餐,便當有一個是新幹線923型的便當盒。後來帶回台灣當紀念品,不過放了幾年後最後還是丟了...


到了廣島站,晚上住:東橫INN 廣島站前大橋南,這個時候姊姊住單人房,我們夫妻跟兒子住雙人房。幾年後就是改成住兩間雙人房了(我跟兒子一間,老婆跟姊姊一間),東橫很少有四人房,畢竟定位是在商務旅館。

0821 廣島 → 宮島

早上吃完早餐搭火車往宮島口站,再坐船到宮島。預計在這邊停留一整天。

小孩子坐平常很少坐的交通工具都很開心。


遇到整修中的嚴島神社海上鳥居。我們跟『整修』這兩個字滿有緣的,之前遇到整修中的清水神社。整修中的反而比一般正常的更少見。


宮島上的鹿真的比奈良的鹿溫馴多了...感覺宮島鹿過的比較悠哉。

這是靈火堂,會特別放這張照片是因為,它最近(20260521)燒掉了...


雖然宮島不高,但爬起來也是會累人的。最後只有我跟姊姊爬到山頂。還好一開始我們就選擇坐纜車上山,在前半段省了很多體力。

宮島是很讓人放鬆的點,到處逛逛走走都不錯,我對紅葉谷公園印象深刻。宮島可以慢慢的逛一整天。下山的時候老婆跟姊姊沒有坐上接駁車。她們用走的慢慢下來,結果我們下車的時候她們也走到了。吃了生蠔和紅葉饅頭,幫同事找一下星巴克的杯子,結果聽說一早就賣完了...

晚餐在廣島站的美食街的麗ちゃん廣島燒用餐,吃了滿滿一大份的廣島燒,相當美味。

0822 廣島市 → 岡山城 → 後樂園

今天早上先在廣島市走走,看到路面電車,我跟姊姊急急忙忙的上車,結果又坐錯方向了 XD,果然呷緊弄破碗。

廣島這個城市有一股悲傷的氣息...,其實磁場不是太讓人舒服....


由於下午還要去岡山城,我們就不去廣島城了。我們去了原爆ドーム、原爆の子の像
平和の鐘、慈仙寺之鼻、平和の時計塔、国立広島原爆死没者追悼平和祈念館、祈りの泉
動員学徒慰霊塔和附近的景點。當然也沒有忘了去兒子最愛的BOOKOFF SUPER BAZAAR 広島大手町店買玩具。

中午坐新幹線去岡山,先去東橫INN 岡山車站東口放行李。接著去食堂 やまと吃午餐。路上遇到一位有禮貌的中國人詢問去岡山城的路,我們跟她聊了一下,她剛從宇治過來。知道路後,她就先自己過去岡山城。我腳痛,家人陪我慢慢走(當時不曉得要穿寬楦的鞋子)。到了岡山城後,又巧遇這位中國人,她很親切的通知我們先去預約和服免費體驗,避免後面人多要等很久。感謝她,我們沒有等多久就有了和服初體驗。

在岡山城參觀了一下,就去隔壁的後樂園參觀 (是套票),結果我姊又掉了後樂園的票...之前在鎌倉她也掉過電車票....聽說姊姊在公司是以精細著稱的,讓人相當懷疑 XD


其實我還滿喜歡日式庭園的,不過姊姊覺得人工的氛圍太重。只能說青菜蘿蔔各有所好。

晚上在飯店附近的日本岡山「ICOT NICOT」商場拉麵大街,由於我腳痛,我們就在附近吃一吃。吃完在同棟的百貨公司買了岡山著名的麝香葡萄與巨峰葡萄和白桃吃。

0823 倉敷美觀 →  永旺夢樂城

今天的行程是在倉敷美觀悠閒的逛一天,我們有預約乘船體驗。先去預約船班再去逛,接著去吃午餐。我們找到一家平常不接外國客的法式餐廳:Bistrot Romanee ,老闆本來是不接我們的,但後來可能看我們很有誠意,就勉為其難的接待我們。餐點出乎意料之外的好吃。

之後就去坐船了,景觀很有中式河畔的感覺。


下午回飯店前,在永旺夢樂城讓孩子消耗一下體力。

晚餐一樣在飯店附近的日本岡山「ICOT NICOT」商場拉麵大街用餐,有四家拉麵店,大家選自己想吃的去,各自愉快。

0824 岡山 → 兵庫 → 姬路城 → 好古園 → 鐵道博物館

早上先坐新幹線去姬路城,依計畫應該是要坐公車的,但走了一下看不到半部公車(之後查了一下,因為道路施工,公車換了路線),不過距離不遠,邊聊邊走,姬路城也就到了。


前前後後在日本也看過十幾座城了,對我們來說城比較沒有新鮮感。中午到隔壁的好古園用餐(姬路城跟好古園也是套票)。餐點很好吃,日式莊園的氛圍也很好,小巧玲瓏,走起來也不會太累。




下午繼續坐新幹線到京都,然後悲劇就發生了....我們上了新幹線之後,一路坐到京都。但沒有辦法出站。原因是我們買的周遊券新幹線的部份只能坐到新大阪車站。所以後來我們補了差價(特快與新幹線的價差),才順利出站。其實我們的JR PASS上有路線圖,我們必須在新大阪換乘expresss才行。不過旅行嘛,總會有點小意外...

說來也算運氣好。要住的民宿 京都Inn,本來是離京都站有一點距離的,所以在訂房時有點猶豫,但剛好梅小路京都西車站新設立,離民宿只有300公尺遠。入住後和打工換宿的學生聊了一下,他之前竟然剛好是在兒子念的小學服替代役,真的有夠巧。


兒子滿常去鐵博館玩耍的(之前也去過名古屋的),不過這邊遇到不管小孩而且也講不聽的中國人,有點殘念。

晚上本來想吃スシロー 五条七本松店,但要等兩個小時。後來吃了京都北白川ラーメン魁力屋 丹波口店,用完餐後,剛好附近有ユニクロ 五条丹波口店,就順便逛一下,幫兒子補一些貨,補了一件紅色的外套,兒子也穿了好幾年。

晚上在民宿休息,兒子覺得上下鋪的房間很有趣。

0825 京都 → 天橋立 → 伊根舟屋

天橋立的部份,事先在台灣訂了:丹後天橋立・伊根2日無限次數通票。從京都往天橋立最有趣的就是大家的換車秀。在「福知山站」下車,步行至對面月台,轉乘「京都丹後鐵道」至「天橋立站」,之前很擔心不曉得能不能趕得上,結果很有趣的是,乘客都會先準備好,然後狂衝,跟著別人跑就對了,不過車長說他們其實會等我們...但總之,不要讓別人等會比較好。火車票券的部份改用JR關西廣域鐵路周遊券。到天橋立記得先去取套票。

順利到了天橋立(可惜忘了騎天橋立空中腳踏車)。兒子很喜歡坐單人纜車。

天橋立太多人拍過,就不放照片了。不過我們終於把日本三景都補完了。

下午坐公車去伊根舟屋,要注意回程的時間。餵海鷗和老鷹超有趣的。

中午在海宮(わだつみ) 鮨割烹吃飯,一開始不敢訂太多,老闆有點失望,還好後來發現好吃,又加點了幾份,老闆才展開笑容。


下午回天橋立繼續玩耍。晚上回京都吃飯。這邊一直想不起來在哪邊吃的飯(畢竟過了七年)。姊姊有拍照,吃的是なか卯 ,我一直覺得是在八条口,但姊姊的記錄是在二条吃的。

後來問了AI,跟同事討論了一下,才發現是我記錯了。對照了google map,我們是搭JR橋立線,在二条站下車,順便吃飯,再搭JR山陰本線,回到梅小路西站。

0826 → 貴船神社,平安神宮、晴明神社

今天是神社之旅。先去貴船神社,逛完後,本來打算吃個流水細麵的,結果人太多,沒有先來排隊根本吃不到,改吃咖哩飯(貴船俱樂部)。玩了一下水占卜,滿有趣的。

接著坐公車去平安神宮,印象中好像又坐錯方向了。還好我上車之後馬上覺得不對 (因為下一站跟google map寫的不一樣),馬上就下車 (感謝當時只要600日元的京都公車一日券)。

接著往平安神宮,平安神宮的正能量很強,我非常喜歡這個點(後來想想可能是因為到處都可以坐,而且有樹蔭。園區很大可以逛很久,不過有部份在整修中,我們走馬看花的走了一下。


最後的一個景點是晴明神社,這個算是著名的動漫景點(其實著名的是晴明公)。

晚上就近在吉野家吃晚餐。

0826 京都 → 關西空港 → 高雄

終於到了我最期待的部份了,就是回家。看似最簡單的部份,但有一點驚險。原因是我嚴重腹洩,在廁所排了很久的隊,還好後來有趕上haruka (最近看新聞,有人在日本某車站因為忍不下去了,給每個排隊的人1000日元讓他插隊,有時在尊嚴面前,錢真的不算什麼....)

去關西機場的時候,不太會自主報到,花了一點時間。其它都很順利。









































































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優先於存檔

cacti 破圖的處理方式及Get Script Server Data及Get Script Data的差異

運氣很不好,cacti用別人寫的Cisco ASR的CPU及記憶體 template突然破圖。

先做基本查錯。
在log看到以下訊息:
ERROR: Input Expected, Script Server Terminating
PHP Script Server communications lost.  Restarting PHP Script Server

查了網路上的教學,一般是建議手動執行script_server.php來除錯。但我一執行就有錯誤訊息:(在另一台主機就沒有)
php -q script_server.php
PHP Script Server has Started - Parent is cmd
ERROR: Input Expected, Script Server Terminating

網路上有人教更進一步的除錯,終於有了比較明顯的訊息。感覺是主機的問題,造成parser時好時壞。(這主機很多人在裝套件我自己也更新過PHP之類的),不曉得是哪一個環節出了問題。
php -q poller.php --force --debug
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 1: ?php
:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 2: /bin:
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: syntax error near unexpected token `$_SERVER["argv"][0]'
/usr/share/cacti/site/scripts/ss_cisco-cpm.php: line 3: `if (!isset($_SERVER["argv"][0]) || isset($_SERVER['REQUEST_METHOD'])  || isset($_SERVER['REMOTE_ADDR'])) {
'
此題暫時無解,就再觀望一下吧目前是用另一台librenms先頂著用。

順便比較一下Get Script Server Data與Get Script Data的差異:


Get Script Server Data(Indexed):
在執行的時候需要指定function (ss_ciscocpm),因此只能在script_server.php的環境下除錯 (但在我的狀況下由於一執行script_server就當掉,因此無法除錯)
SERVER: /usr/share/cacti/site/scripts/ss_cisco-cpm.php ss_ciscocpm mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: 2


Get Script Data(Indexed):
不用指定function,因此也可以直接在cli下除錯。
SCRIPT: /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 55 2:161:5000:1:10:public:::::: get 1min 2082, output: U

例如:
php -q /usr/share/cacti/site/scripts/ss_cisco-cpm.php mydevice 4 2:161:5000:1:10:public:::::: get 1min 82

2019年4月30日 星期二

CSV檔補上BOM (exec PHP under apache)

開發程式時遇到一個問題。
就是CSV檔如果用EXCEL開中文的部份就會變亂碼,即使我檔案裡面明明是UTF8也一樣。

查了一下,就是要在檔案加上BOM,讓EXCEL知道檔案的編碼是UTF8

網路上可以查到很方便的解法,它是在CLI下運作的:

sed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' $input_ip.csv
如果前面有加了就不要再加 如果沒有加就加

sed -i '1s/^/\xef\xbb\xbf/' test.csv
不管怎麼樣都要加。

以上這兩個都是好方法,我測試時不管是丟在PHP程式裡再用exec來執行或在CLI手動執行時都正常。但放在網頁執行就有問題。大概又是那些要加反斜線 (\)之類的問題。但試了一下都沒有解決。於是我去找其它不需要加反斜線的解法,就像下面這行:

exec("printf '\xEF\xBB\xBF' | cat - tmp.csv > policies-out.csv");
在網頁環境執行PHP一樣可以跑。  

2019年4月17日 星期三

can't convert string from 'utf-8' to native encoding 的解決方式(SVN crontab not work)

跑了很久的svn,突然不能在crontab裡作業。但手動執行卻又是好的。


svn執行時又沒有log可以看。


試了半天才想到,在crontab -e可以加mailto,讓它寄mail給我看。



執行時有這個訊息:

can't convert string from 'utf-8' to native encoding


知道問題就比較好解決,在shell script裡加上這一行就好了:

export LC_CTYPE=en_US.UTF-8

Could not find/open font (PHP GD不出圖的處理方式)

有一個老程式在搬家之後突然不work了,看了一下可以出圖但不能出字。

本來以為是新的代管主機不能上網抓google cvs的關係。但看了一下並不是。

由於代管主機不能ssh查修。先把系統移回自己的主機試一下。

在查修的時候需要開log。
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
把所有log都打開。


接著執行程式就看到以下的訊息

PHP Warning:  imagettfbbox(): Could not find/open font in /home/klting/MakeGif.php on line 250
PHP Warning:  imagettftext(): Could not find/open font in /home/klting/MakeGif.php on line 165


拿這個訊息去餵狗 ,大概知道是GD對於目錄定義的問題(我猜想是為了安全性)。

只要在呼叫imagettfbbox或imagettftext之前

先做以下設定:

putenv('GDFONTPATH=' . realpath('.'));

讓GD知道要去哪邊找字型檔就好了。


但我會建議以下做法,原因很簡單,通常代管主機的路徑很複雜。所以讓GD知道實體目錄在哪比較方便。

事實上我用上面的做法是失敗的。但用我的作法就成功了。(為了驗證這個我還多花了30分鐘)

$PATH = dirname(__FILE__);

putenv('GDFONTPATH=' . realpath($PATH));

2019年3月18日 星期一

fortigate 的rsh規則開立 已有session helper是否需要開迴向規則測試

其實這個東西一聽就知道不用開迴向規則,因為FTP都不用了。不過還是測試一下,以下是RSH的測試情形:

rsh:很典型的運作,我並沒有開立迴向規則,但rsh client還是可以執行指令
在此可以看出rsh的port使用的是比較低的port (1022)
KS080-FW-FG100A-~ # diagnose sniffer packet internal 'host 59.105.191.159 and host 10.100.32.37'
interfaces=[internal]
filters=[host 59.105.191.159 and host 10.100.32.37]
17.383345 59.105.191.159.1023 -> 10.100.32.37.514: syn 124813949
17.383546 10.100.32.37.514 -> 59.105.191.159.1023: syn 3328922962 ack 124813950
17.384945 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328922963
17.385015 59.105.191.159.1023 -> 10.100.32.37.514: psh 124813950 ack 3328922963
17.385180 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813955
17.386397 10.100.32.37.1022 -> 59.105.191.159.1022: syn 2828457835
17.387884 59.105.191.159.1022 -> 10.100.32.37.1022: syn 313646095 ack 2828457836
17.388055 10.100.32.37.1022 -> 59.105.191.159.1022: ack 313646096
17.389497 59.105.191.159.1023 -> 10.100.32.37.514: psh 124813955 ack 3328922963
17.389670 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813972
17.392663 10.100.32.37.514 -> 59.105.191.159.1023: psh 3328922963 ack 124813972
17.394048 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328922964
17.394721 10.100.32.37.514 -> 59.105.191.159.1023: 3328922964 ack 124813972
17.394845 10.100.32.37.514 -> 59.105.191.159.1023: 3328924412 ack 124813972
17.394952 10.100.32.37.514 -> 59.105.191.159.1023: psh 3328925860 ack 124813972
17.395035 10.100.32.37.514 -> 59.105.191.159.1023: psh fin 3328927060 ack 124813972
17.395068 10.100.32.37.1022 -> 59.105.191.159.1022: fin 2828457836 ack 313646096
17.396794 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328924412
17.397112 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328925860
17.397317 59.105.191.159.1023 -> 10.100.32.37.514: ack 3328927060
17.397369 59.105.191.159.1022 -> 10.100.32.37.1022: ack 2828457837
17.398629 59.105.191.159.1022 -> 10.100.32.37.1022: fin 313646096 ack 2828457837
17.398680 59.105.191.159.1023 -> 10.100.32.37.514: fin 124813972 ack 3328927067
17.398802 10.100.32.37.1022 -> 59.105.191.159.1022: ack 313646097
17.398839 10.100.32.37.514 -> 59.105.191.159.1023: ack 124813973

以下是REXEC的測試情形,同樣沒有開立迴向規則,但還是會通。
Port位高很多。
KS080-FW-FG100A-~ # diagnose sniffer packet internal 'host 59.105.191.159 and host 10.100.32.37'
interfaces=[internal]
filters=[host 59.105.191.159 and host 10.100.32.37]
6.071296 59.105.191.159.59432 -> 10.100.32.37.512: syn 1770357772
6.071556 10.100.32.37.512 -> 59.105.191.159.59432: syn 1011819499 ack 1770357773
6.073041 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011819500
6.073099 59.105.191.159.59432 -> 10.100.32.37.512: psh 1770357773 ack 1011819500
6.073226 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357779
6.074641 10.100.32.37.47809 -> 59.105.191.159.58852: syn 1063549796
6.076164 59.105.191.159.58852 -> 10.100.32.37.47809: syn 1201608936 ack 1063549797
6.076351 10.100.32.37.47809 -> 59.105.191.159.58852: ack 1201608937
6.077699 59.105.191.159.59432 -> 10.100.32.37.512: psh 1770357779 ack 1011819500
6.077874 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357799
6.084569 10.100.32.37.512 -> 59.105.191.159.59432: psh 1011819500 ack 1770357799
6.085916 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011819501
6.086326 10.100.32.37.512 -> 59.105.191.159.59432: 1011819501 ack 1770357799
6.086450 10.100.32.37.512 -> 59.105.191.159.59432: 1011820949 ack 1770357799
6.086575 10.100.32.37.512 -> 59.105.191.159.59432: psh 1011822397 ack 1770357799
6.086620 10.100.32.37.47809 -> 59.105.191.159.58852: fin 1063549797 ack 1201608937
6.086655 10.100.32.37.512 -> 59.105.191.159.59432: psh fin 1011823597 ack 1770357799
6.088397 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011820949
6.088708 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011822397
6.088858 59.105.191.159.59432 -> 10.100.32.37.512: ack 1011823597
6.090055 59.105.191.159.58852 -> 10.100.32.37.47809: fin 1201608937 ack 1063549798
6.090114 59.105.191.159.59432 -> 10.100.32.37.512: fin 1770357799 ack 1011823604
6.090242 10.100.32.37.47809 -> 59.105.191.159.58852: ack 1201608938
6.090279 10.100.32.37.512 -> 59.105.191.159.59432: ack 1770357800


順便看一下rcp,並未看到開其它的Port,所以更單純。
klting@ubuntu:~$ vi rcp
827.296534 59.105.191.159.1023 -> 10.100.32.37.514: syn 4192287855
827.296709 10.100.32.37.514 -> 59.105.191.159.1023: syn 2950407792 ack 4192287856
827.298139 59.105.191.159.1023 -> 10.100.32.37.514: ack 2950407793
827.298192 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287856 ack 2950407793
827.298313 10.100.32.37.514 -> 59.105.191.159.1023: ack 4192287857
827.299695 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287857 ack 2950407793
827.299871 10.100.32.37.514 -> 59.105.191.159.1023: ack 4192287889
827.302149 10.100.32.37.514 -> 59.105.191.159.1023: psh 2950407793 ack 4192287889
827.302412 10.100.32.37.514 -> 59.105.191.159.1023: fin 2950407794 ack 4192287889
827.303561 59.105.191.159.1023 -> 10.100.32.37.514: ack 2950407794
827.303620 59.105.191.159.1023 -> 10.100.32.37.514: psh 4192287889 ack 2950407794
827.303782 10.100.32.37.514 -> 59.105.191.159.1023: rst 2950407794
827.303875 59.105.191.159.1023 -> 10.100.32.37.514: fin 4192287890 ack 2950407795
827.304030 10.100.32.37.514 -> 59.105.191.159.1023: rst 2950407795