PHP4 fsockopen() 無法使用 ssl:// 的 bug

PHP 4 有 bug 會導致 fsockopen 無法接受 “ssl://example.com”

即使有 OpenSSL support,還是會產生以下這樣的錯誤訊息:

Warning: fsockopen(): no SSL support in this build

PHP BUG #29934: http://bugs.php.net/bug.php?id=29934

解決方法有二:
1. Install PHP 5.x
2. FreeBSD, http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/72275

重裝系統時常常會忘記…. 搞了半天才發現之前就找過答案了.. 寫下來以免以後又忘了
建議若沒有特殊需求,儘量改用 PHP 5.x 吧..

一個顯示農曆及世界時間的好工具!

Microsoft Chinese Date & Time Utility

發現微軟提供了一個顯示日期(農曆/國曆/世界時間)的小工具… 蠻好用的,可以顯示農曆及自選四個世界各地時間,還會考慮日光節約時間

下載網址: http://www.microsoft.com/globaldev/outreach/dnloads/ICalClkSetup.mspx

2009/04/10 補充:

微軟好像拿掉這個程式了,請搜尋 “Microsoft Chinese Date Time” 去找網路上的下載點

羅東林業文化園區

和爸媽走了趟這個成立不久的園區,在羅東生活了幾十年都還沒來過…

裡面蠻幽靜的,樹木很多,步道規劃得還不錯,不會很大,大概半個小時就可以走完

完整的相簿在: http://www.wretch.cc/album/album.php?id=cdsheen&book=2

以下相關的簡介:

台灣有三大林場:太平山、阿里山及八仙山,其中以太平山林場產量最大,鼎盛時期,產量是八仙山林場的4倍、阿里山林場的5.5倍,根據日本人的調查,當時太平山海拔2000公尺以上的山區,珍貴良木的比例佔了80%,放眼林區,週遭都是數百年、高聳入天的巨木。

日本在民國3年發現太平山的豐富林業資源,民國4年就開始買工進駐砍伐,當時還沒有建鐵道,砍伐下來的木材,就順著蘭陽溪流下,一路流流流,流到下游的員山;不過,靠溪水運送,木材很容易損壞,日本人著眼太平山豐富的林業,於是決定花錢建鐵路。

羅東林業文化園區,就是當時木材運下山後的收集、貯存站。

民國67年太平山森林鐵道停駛之後,蒸氣老火車頭也跟著功成身退,靜靜佇立在園區中,過著白雲清風相伴的日子。

貯木池旁,還有一座檢車室,外觀還是原來的模樣,但目前此區尚未開放,未來可能做為文藝空間使用。

羅東林業文化園區仍在建設之中,但因園區大部分為開放空間,不收費用,也常有當地人來此散步。

兒歌: 大鼻孔

蠻好笑的一首兒歌… 今天在電視新聞上看到的,事實上是10多年前創作的

台語兒歌: 大鼻孔
作詞作曲: 施福珍

歌詞內容:

澎恰恰、澎恰恰、澎恰恰的鼻孔大,澎恰恰、澎恰恰、澎恰恰的鼻孔大。
因為細漢的時候,用指頭挖鼻孔,挖到鼻孔黑弄弄,實在嚇死人。
澎恰恰,澎恰恰、澎恰恰的鼻孔大。

影片: http://www.youtube.com/watch?v=lMfW3reSs2E

使用 SSH 配合憑證來遠端備份檔案 (rsync)

前面寫了一篇「使用 SSH 配合憑證來遠端複製檔案
簡介使用 scp 配合 ssh 來遠端複製檔案,這樣的方式對於簡單的檔案複製是可行的,但是如果要備份大量檔案/目錄或程式,就顯得有點不太經濟了

這時候,比較好的作法是利用 rsync 配合 ssh 來運作,我們同樣使用 public/private key 的方式來認證,並限制只能作特定動作

要使用 rsync 之前,請把所有機器的 rsync 都裝起來

# cd /usr/ports/net/rsync
# make
# make install

假設我們要把 Host X 上面的目錄 /home/mysql/ 備份到 Host A 下面 /home/backup-x/ 下面,作法請先參考前一篇文章,先設好信任關係


為了方便說明,我們讓 A 去信任 X,讓 X 可以主動把檔案備份到 A 的機器上面

接下來有幾個地方要作一些修改:

1. 遠端機器 (A) authorized_keys 內的 command 要寫成


command="rsync -az --server . /home/backup-x",no-port-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAACBAPWP8FS.... backup@X


2. 本機機器 (X) 的命令應該是:

rsync -az -v -e ‘ssh -i /home/backup/.ssh/id_dsa’ /home/mysql backup@A:


以上這個命令就會把 X 上面的 /home/mysql/… 備份到 A 上面的 /home/backup-x/mysql/… 了…

要注意 rsync 的語法中,來源目錄有沒有結尾的斜線 (/) 是有差異的喔,詳見 rsync 的說明


以上的作法會受限於目標目錄只能一次只能指定一個,有時間再介紹另外一種作法…

使用 SSH 配合憑證來遠端複製檔案 (scp)

以下整理 UNIX 系統上面使用 SSH 配合憑證來遠端複製檔案

假設有一台主機叫做 X,多台要被複製檔案的機器是 A, B, C。理論上這種情況下 X 的安全等級應該要高於 A, B, C,不過這並不一定


安全等級的差異牽涉到要由哪台機器去信任哪一台機器

以 A, B, C 去信任 X 為例,作法如下:

在 X 上面用某個帳號產生一組 Private/Public Key,然後把 Public Key 發佈給 A, B, C,要求 A, B, C 去信任這一個 Public Key


更進一步,還能限制這個 Public Key 只能作某項動作…

以下是詳細的作法


[步驟一] 產生 Public/Private Key

先在 X 上面開設一個帳號,例如 backup (或者使用現有的任何一個帳號也可以) 然後使用 ssh-keygen -t dsa 命令產生一組 Private/Public Key,內定會在 .ssh/ 目錄下產生兩個檔案: id_dsa id_dsa.pub (不要設定 passphrase)

由於之後會限制一組 Key 只能作特定一件工作,因此我們再執行一次 ssh-keygen -t dsa 產生另一組 Private/Public Key

記得把 Key 儲存成不同的檔名以供辨識,例如我們可以把 .ssh 目錄下的 Key 更名成:

id_cmd1 id_cmd1.pub => 用來執行命令1

id_cmd2 id_cmd2.pub => 用來執行命令2

[步驟二] 設定信任關係

接下來,我們就可以把 id_cmd1.pub 及 id_cmd2.pub 的內容複製到 A, B, C 上面了

首先在 A 上面,建立特定一個帳號,例如 backup,然後執行 vipw (FreeBSD),把 password 欄位置換成 * 星號:


backup:*:1010:50::0:0:backup user:/home/backup:/bin/sh


這樣的話,這個帳號雖然擁有 shell,但也不能隨意用 password 來登入了,只能從 local 用 su – backup 或從遠端用 ssh public key 來進入使用

然後把 id_cmd1.pub 及 id_cmd2.pub 合成一個檔案,放在/home/backup/.ssh/authorized_keys 中:


ssh-dss AAAAB3NzaC1kc3MAAACBAPWP8FS0iatXx3z7o/alB1pI8a…. backup@X
ssh-dss AAAAB3NzaC1kc3MAAACBALW8J12p4Jebc5sAPDhiokTy2…. backup@X


這樣寫,代表 A 上面的 backup 這個帳號信任這組 public/private key,任何人持有該相對應的 private key,都可以 ssh 進入 backup 在 A 上面的帳號

既然可以 ssh,當然也可以自由使用 scp 來複製檔案了,而且使用任何一組 Key 都可以進行沒有限制的作業,


例如從 X 上面可以用 ssh 登入 A:

ssh -i /home/backup/.ssh/id_cmd1 backup@A

ssh -i /home/backup/.ssh/id_cmd2 backup@A


[步驟三] 限制只允許特定動作

由於 ssh 的權限太大,而我們只是要複製檔案 (scp) 而已,因此我們可以再作一些限制。

改寫 /home/backup/.ssh/authorized_keys,在每個 key 開頭加上特定指令,例如

command=”scp -f /tmp/backup.tgz”,no-port-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAACBAPWP8FS…. backup@X
command=”scp -t /tmp/info.tgz”,no-port-forwarding,no-pty ssh-dss AAAAB3NzaC1kc3MAAACBALW8J12p4J…. backup@X

上面 scp -f 代表 copy 的來源, scp -t 代表 copy 的目的地,目的地也可以是一個目錄,但是要再加上 -d 選項

這樣的話,不管對方下了什麼指令,A 都只會執行前面 command 內的指令,所以…. X 只能對 A 進行下列兩種工作,而且都要指定正確的 Key 才能完成:

scp -i /home/backup/.ssh/id_cmd1 backup@A:/tmp/backup.tgz backup-A.tgz

scp -i /home/backup/.ssh/id_cmd2 data.tgz backup@A:/tmp/info.tgz

上面 scp -i 就是指定該動作要使用的身份,後面接上相對應的 private key 即可


事實上,由於每個 key 只會被對方的機器允許作特定的事情,因此遠方的目錄及檔案名稱甚至可以省略,例如:

scp -i /home/backup/.ssh/id_cmd1 backup@A: backup-A.tgz

scp -i /home/backup/.ssh/id_cmd2 data.tgz backup@A:

測試沒有問題後,把 authorized_keys 同樣複製一份到 B, C 上面就大功告成了

備註: 如果您要大量複製、備份檔案,請參考另外一篇「使用 SSH 配合憑證來遠端備份檔案 (rsync)