用PHP實(shí)現(xiàn)Ftp用戶的在線管理
Ftp服務(wù)器是系統(tǒng)默認(rèn)帶的,采用系統(tǒng)用戶的用戶名和密碼,創(chuàng)建系統(tǒng)用戶就等于創(chuàng)建FTP用戶,F(xiàn)reeBSD是屬于UNIX陣營(yíng)的操作系統(tǒng),它沒(méi)有象Linux一樣的useradd和groupadd等創(chuàng)建用戶和組的命令,其取而代之的是pw命令加上相應(yīng)參數(shù)來(lái)實(shí)現(xiàn),在Freebsd上以管理員的身份創(chuàng)建一個(gè)用戶的命令是
echo | pw useradd [-g][groupname] [-s][shelldir][-h 0]
參數(shù)g指定用戶組,參數(shù)s指定用戶的shell。
如果是普通用戶登陸的話還必須用到su命令,調(diào)用的方法是
su root –c ‘echo | pw useradd [-g][groupname] [-s][shelldir][-h 0] '
執(zhí)行之后系統(tǒng)會(huì)要求輸入管理員密碼,輸入密碼就可以以管理員的身份執(zhí)行這個(gè)命令了。
實(shí)現(xiàn)這步操作的主要難點(diǎn)在于如何通過(guò)PHP來(lái)調(diào)用上面這些系統(tǒng)命令去創(chuàng)建一個(gè)用戶,本例是使用PHP中的popen()函數(shù)來(lái)實(shí)現(xiàn)的,該函數(shù)執(zhí)行指令打開(kāi)文件,語(yǔ)法是int popen(string command, string mode),其打開(kāi)的文件只能是單向的,只能讀或只能寫(xiě),對(duì)應(yīng)的“string mode”為'r'或'w',“string command” 就是命令字符串,在對(duì)文件的操作上可使用 fgets()、fgetss()與fputs()函數(shù),本例用fputs()函數(shù)往文件里面輸入管理員密碼。若是開(kāi)檔發(fā)生錯(cuò)誤將返回 false 值,最后函數(shù)要記得調(diào)用pclose()關(guān)閉。
下面我們來(lái)規(guī)劃一下FTP用戶的組,事先我們先用pw groupadd ftpuser創(chuàng)建ftpuse組,讓在線申請(qǐng)的用戶為這個(gè)組的成員。為了安全起見(jiàn),我們不應(yīng)該給FTP用戶Telnet權(quán)限,所以我們還要專門(mén)給他們創(chuàng)建一個(gè)shell,使得他們不能通過(guò)Telnet正常登陸系統(tǒng),方法如下:先創(chuàng)建一個(gè)文件/bin/ftponly
#!/bin/csh
/bin/cat << XX
You can ony use this username to login ftp server!
And you can not use it to telnet to this system! XX
sleep 10
該文件中XX之間就是顯示給用telnet登陸的用戶看的信息。信息顯示10秒鐘就自動(dòng)退出了。最后不要忘記用chmod +x /bin/ftponly給這個(gè)文件可執(zhí)行屬性。
然后在/bin/shell文件中添加“/bin/ftponly”,在以后的命令里面我們就可以利用pw中-s參數(shù)把這個(gè)shell指定給FTP用戶了。
最后還要注意一個(gè)問(wèn)題,su命令僅僅是wheel管理組的用戶成員才可以使用,當(dāng)PHP調(diào)用su命令的時(shí)候也必須以wheel組成員的身份運(yùn)行,否則系統(tǒng)拒絕運(yùn)行,而PHP運(yùn)行系統(tǒng)命令的身份就是Apache Web服務(wù)器運(yùn)行的身份,初始的用戶名和用戶組都是nobody,所以先得建立一個(gè)wheel組的用戶www供apache使用,接著更改Apache的配置文件httpd.conf中的user為www,group為wheel,重新啟動(dòng)Apache,就可以以新用戶身份運(yùn)行了。
下面可以創(chuàng)建PHP源文件checkin.php了,代碼如下:
<?if (($username!="") and ($userpasswd!=""))//判斷是否有表單提交了信息
{ $rootpasswd="adminpassword"; //定義管理員密碼
$creatuser ="su --login root -c 'echo ".$userpasswd." | pw useradd ".$username." -s /bin/ftponly -g ftpuser –s /bin/ftponly -h 0' "; //這是利用su和pw命令創(chuàng)建用戶的用到的字符串
$fp=popen($creatuser,"w"); //調(diào)用popen()函數(shù)執(zhí)行字符串中的命令,返回文句柄給$fp
fputs($fp,$rootpasswd); //寫(xiě)入管理員密碼到文件$fp,相當(dāng)于輸入密碼給系統(tǒng)
pclose($fp);//關(guān)閉文件
$creatdir="su --login root -c 'mkdir /home/".$username."'";//創(chuàng)建用戶目錄的命令字符串
$fp=popen($creatdir,"w");//執(zhí)行命令創(chuàng)建用戶目錄
fputs($fp,$rootpasswd); //輸入管理員密碼
pclose($fp);
$creatdir="su --login root -c 'mkdir /home/".$username."/public_html'";
$fp=popen($creatdir,"w"); //執(zhí)行命令創(chuàng)建用戶網(wǎng)站根目錄
fputs($fp,$rootpasswd); //輸入管理員密碼
pclose($fp);
$creatdir="su --login root -c 'chown ".$username." /home/".$username."'"; //改變用戶目錄的所有者為用戶自己,初始為運(yùn)行Apache的用戶www。
$fp=popen($creatdir,"w"); //執(zhí)行命令
fputs($fp,$rootpasswd); //輸入管理員密碼
pclose($fp);
$creatdir="su --login root -c 'chown ".$username." /home/".$username."/public_html'"; //改變網(wǎng)站根目錄的歸屬
$fp=popen($creatdir,"w");
fputs($fp,$rootpasswd);
pclose($fp);
echo "恭喜".$username.",您的的FTP賬號(hào)已經(jīng)申請(qǐng)成功!請(qǐng)到FTP上登陸,請(qǐng)注意,您沒(méi)有Telnet權(quán)限";}
else{?>
<html>
<head>
<title>申請(qǐng)F(tuán)TP賬號(hào)</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<div align="center">
<p>申請(qǐng)F(tuán)TP賬號(hào)</p>
<form method=POST action="<? echo $PHP_SELF; ?>">
<table width="36%" border="0">
<tr>
<td width="40%">
<div align="right">賬號(hào)名稱:</div>
</td>
<td width="60%">
<input type="text" name="username">
</td>
</tr>
<tr>
<td width="40%">
<div align="right">密碼:</div>
</td>
<td width="60%">
<input type="password" name="userpasswd">
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="Submit" value="申請(qǐng)"></td>
</tr>
</table>
</form>
</div><?}?>
</body>
</html>
- php中ftp_chdir與ftp_cdup函數(shù)用法
- php中FTP函數(shù)ftp_connect、ftp_login與ftp_chmod用法
- php ftp文件上傳函數(shù)(基礎(chǔ)版)
- php下連接ftp實(shí)現(xiàn)文件的上傳、下載、刪除文件實(shí)例代碼
- php實(shí)現(xiàn)從ftp服務(wù)器上下載文件樹(shù)到本地電腦的程序
- PHP實(shí)現(xiàn)ftp上傳文件示例
- 深入PHP FTP類的詳解
- PHP FTP操作類代碼( 上傳、拷貝、移動(dòng)、刪除文件/創(chuàng)建目錄)
- php建立Ftp連接的方法
- 用PHP實(shí)現(xiàn)Ftp用戶的在線管理的代碼
- PHP中FTP相關(guān)函數(shù)小結(jié)
相關(guān)文章
php遞歸實(shí)現(xiàn)無(wú)限分類生成下拉列表的函數(shù)
php自定義函數(shù)之遞歸實(shí)現(xiàn)無(wú)限分類生成下拉列表,這樣可以提高效率,不用每次都從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。2010-08-08php簡(jiǎn)單防盜鏈驗(yàn)證實(shí)現(xiàn)方法
這篇文章主要介紹了php簡(jiǎn)單防盜鏈驗(yàn)證實(shí)現(xiàn)方法,通過(guò)$_SERVER['HTTP_REFERER']獲取來(lái)路頁(yè)面URL再進(jìn)行判斷進(jìn)而實(shí)現(xiàn)對(duì)非本地URL的攔截功能,需要的朋友可以參考下2016-07-07nginx+thinkphp下解決不支持pathinfo模式
這篇文章主要介紹了nginx+thinkphp下解決不支持pathinfo模式的相關(guān)資料,需要的朋友可以參考下2015-07-07使用php將某個(gè)目錄下面的所有文件羅列出來(lái)的方法詳解
本篇文章是對(duì)使用php將某個(gè)目錄下面的所有文件羅列出來(lái)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06ThinkPHP中實(shí)例Model方法的區(qū)別說(shuō)明
在TP中,我們對(duì)數(shù)據(jù)庫(kù)操作時(shí)多數(shù)都是用TP提供的model去先創(chuàng)建一個(gè)表的映射實(shí)例,然后在對(duì)數(shù)據(jù)進(jìn)行處理,但是不同的創(chuàng)建方法對(duì)數(shù)據(jù)的處理和信息的返回卻有所不同。2010-08-08php中http與https跨域共享session的解決方法
這篇文章主要介紹了http與https跨域共享session的解決方法,需要的朋友可以參考下2014-12-12PHP實(shí)現(xiàn)Redis分布式鎖的示例代碼
并發(fā)寫(xiě)入問(wèn)題可能導(dǎo)致數(shù)據(jù)不一致或重復(fù)寫(xiě)入,為了解決這個(gè)問(wèn)題,我們可以使用Redis實(shí)現(xiàn)分布式鎖,本文主要為大家介紹了PHP實(shí)現(xiàn)Redis分布式鎖的相關(guān)知識(shí),希望對(duì)大家有所幫助2023-12-12PHP通過(guò)正則表達(dá)式下載圖片到本地的實(shí)現(xiàn)代碼
PHP通過(guò)正則表達(dá)式下載圖片到本地的實(shí)現(xiàn)代碼,主要是通過(guò)正則表達(dá)式匹配網(wǎng)頁(yè)內(nèi)容中的圖片地址并下載。2011-09-09用PHP調(diào)用Oracle存儲(chǔ)過(guò)程的方法
php程序訪問(wèn)數(shù)據(jù)庫(kù),完全可以使用存儲(chǔ)過(guò)程,有人認(rèn)為使用存儲(chǔ)過(guò)程便于維護(hù)。不過(guò)仁者見(jiàn)仁,智者見(jiàn)智,在這個(gè)問(wèn)題上,偶認(rèn)為使用存儲(chǔ)過(guò)程意味著必須要dba和開(kāi)發(fā)人員更緊密配合,如果其中一方更變,則顯然難以維護(hù)。2008-09-09