領導者要我策劃一個網頁設計大賽和Flash創作大賽,要求必須實現線上報名和上傳作品。透過FreeBSD+Apache+PHP+Mysql+FTP我實現了這個要求。 複製程式碼 程式碼如下: 申請FTP帳號
實現線上報名和上傳作品的想法是利用網頁表單收集使用者填寫的資料儲存到Mysql資料庫內,同時以該使用者的註冊名稱建立一個FTP上傳帳號並建立該使用者的對應目錄。
FTP伺服器是系統預設帶的,採用系統用戶的用戶名和密碼,創建系統用戶就等於創建FTP用戶,FreeBSD是屬於UNIX陣營的作業系統,它沒有像Linux一樣的useradd和groupadd等創建用戶和群組的命令,其取而代之的是pw指令加上對應參數來實現,在Freebsd上以管理員的身分建立使用者的指令是
echo
參數g指定使用者群組,參數s指定使用者的shell。
如果是一般使用者登陸的話也必須用到su指令,呼叫的方法是
su root –c 'echo
執行之後系統會要求輸入管理員密碼,輸入密碼就可以以管理員的身分執行這個指令了。
實現這步驟操作的主要困難在於如何透過PHP來呼叫上面這些系統指令去建立一個用戶,本例是使用PHP中的popen()函數來實現的,該函數執行指令開啟文件,語法是int popen(string command, string mode),其開啟的檔案只能是單向的,只能讀或只能寫,對應的「string mode」為'r'或'w',「string command」 就是指令字符串,在檔案的操作上可使用 fgets()、fgetss()與fputs()函數,本例以fputs()函數為檔案內輸入管理員密碼。若是開檔發生錯誤將回傳 false 值,最後函數要記得呼叫pclose()關閉。
下面我們來規劃一下FTP使用者的群組,事先我們先用pw groupadd ftpuser建立ftpuse群組,讓線上申請的使用者為這個群組的成員。為了安全起見,我們不應該給FTP使用者Telnet權限,所以我們還要專門為他們建立一個shell,使得他們不能透過Telnet正常登陸系統,方法如下:先建立一個檔案/bin/ftponly
#!/ bin/csh
/bin/cat You can ony use this username to login ftp server!
And you can notsluse >該文件中XX之間就是顯示給用telnet登陸的使用者看的資訊。訊息顯示10秒鐘就自動退出了。最後不要忘記用chmod +x /bin/ftponly給這個檔案可執行屬性。
然後在/bin/shell檔中加入“/bin/ftponly”,在以後的指令裡面我們就可以利用pw中-s參數把這個shell指定給FTP使用者了。
最後也要注意一個問題,su指令只是wheel管理群組的使用者成員才可以使用,當PHP呼叫su指令的時候也必須以wheel群組成員的身分運行,否則系統拒絕運行,而PHP運作系統指令的身份就是Apache web伺服器運行的身份,初始的使用者名稱和使用者群組都是nobody,所以先得建立一個wheel群組的使用者www供apache使用,接著更改Apache的設定檔httpd.conf中的user為www, group為wheel,重新啟動Apache,就可以以新使用者身分運行了。
下面可以建立PHP原始檔checkin.php了,程式碼如下:
{ $rootpasswd="adminpassword"; //定義管理者密碼
$creatuser="su --login root -c 'echo ".$userpasswd." | pw useradd ".$username." -s /bin/ftponly -g ".$username." -s /bin/ftponly -g puser.$ -h 0' "; //這是利用su和pw指令創建使用者的用到的字串
$fp=popen($creatuser,"w"); //呼叫popen()函數執行字串中的指令,返回文句柄給$fp
fputs($fp,$rootpasswd); //寫入管理者密碼到檔案$fp,相當於輸入密碼給系統
pclose($fp);//關閉檔案
$creatdir="su --login root -c 'mkdir /home/".$username."'";//建立使用者目錄的命令字串
$fp=popen($creatdir, "w");//執行指令建立使用者目錄
fputs($fp,$rootpasswd); //輸入管理者密碼
pclose($fp);
$creatdir="su --login root -c 'mkdir /home/".$username."/public_html'";
$fp=popen($creatdir,"w"); //執行指令建立使用者網站根目錄
fputs($ fp,$rootpasswd); //輸入管理員密碼
pclose($fp);
$creatdir="su --login root -c 'chown ".$username." /home/".$username ."'"; //改變使用者目錄的擁有者為使用者自己,初始為執行Apache的使用者www。
$fp=popen($creatdir,"w"); //執行指令
fputs($fp,$rootpasswd); //輸入管理者密碼
pclose($fp);
$creatdir="su --login root -c 'chown ".$username." /home/".$username."/public_html'"; //改變網站根目錄的歸屬
$fp=popen($fp=popen($ creatdir,"w");
fputs($fp,$rootpasswd);
pclose($fp);
echo "恭喜".$username.",您的FTP帳號已經申請成功!請到FTP登陸,請注意,您沒有Telnet權限";}
else{?>