測試環境RedHat 6.4 一.安裝 samba組件安裝: (1)首先用“rpm –qa |grep samba”命令檢驗系統samba服務是否安裝。 #rpm –qa |grep samba samba-common-3.6.9-151.el6.x86_64.rpm samba-winbind-
測試環境RedHat 6.4
一.安裝
samba組件安裝:
(1)首先用“rpm –qa |grep samba”命令檢驗系統samba服務是否安裝。
#rpm –qa |grep samba
samba-common-3.6.9-151.el6.x86_64.rpm
samba-winbind-3.6.9-151.el6.x86_64.rpm
samba-winbind-clients-3.6.9-151.el6.x86_64.rpm
samba-3.6.9-151.el6.x86_64.rpm
(2)如果沒有顯示samba(版本)信息,則說明沒有安裝,利用“RedHat Linux安裝光碟”里自帶的RPM包進行安裝(也可自己在網上下載相關的版本包進行安裝)。(可以通過壓縮工具打開RedHat的鏡像iso文件,在rpm包目錄下可以找到相關samba的包)
rpm -ivh samba-common-3.6.9-151.el6.x86_64.rpm -f --nodeps
rpm -ivh samba-winbind-3.6.9-151.el6.x86_64.rpm -f --nodeps
rpm -ivh samba-winbind-clients-3.6.9-151.el6.x86_64.rpm -f --nodeps
rpm -ivh samba-3.6.9-151.el6.x86_64.rpm -f –nodeps
rpm -ivh samba4-libs-4.0.0-55.el6.rc4.x86_64.rpm –f –nodeps
rpm -ivh samba-client-3.6.9-151.el6.x86_64.rpm –f -nodeps
卸載命令:# rpm -e [包名]
或者強制卸載: # rpm -e --nodeps [包名]
二.Samba的smb.conf文件配置
cd /etc/samba
mv smb.conf smb_bak.conf(備份源文件)
touch smb.conf
將下文複製進smb.conf中:
[gobal]
workgroup = LinuxSir
netbios name = RedHat
server string = Linux Samba Server
security = user
hosts allow = 192.168.1. 192.168.2. 127.
[public]
path = /XXXX/shareimg
writeable = yes
valid users = root
browseable = yes
guest ok = no
(public為訪問時的路徑名,path為系統實際路徑)
文件配置介紹:
全局選項用於[global]的<section>選項定義中,其用於說明samba伺服器的一些基本屬性。其有些選項可以被其他<section>中的選項定義覆蓋。
workgroup = MYGROUP
定義samba伺服器所在的工作組或者域(如果設置security = domain的話)。
server string = Samba server
設定samba伺服器的描述,通過網路鄰居訪問時可在備註中查看到該描述信息。
hosts allow = host (subnet)
設定允許訪問該samba伺服器的主機IP或網路,該選項的值為列表類型,不同的項目之間使用空格或逗號隔開,例如hosts allow = 192.168.3.0, 192.168.1.1,該選項設置允許主機192.168.1.1以及子網192.168.3.0/24內的所有主機訪問該samba伺服器。
hosts deny = host (subnet)
設定不允許訪問該samba伺服器的主機IP或網路,其格式與hosts allow一樣。
guest account = guest
設定了游客的賬號,在游客訪問guest ok = yes的共用服務時,samba伺服器將設置客戶端以該游客賬號來訪問共用。
log file = MYLOGFILE
設定記錄文件的位置。
max log size = size
設定記錄文件的大小,單位為KB,如果設置為0則表示無大小限制。
security =
設定samba伺服器的安全級,其有四種安全級別:share、user、server和domain,預設為user。關於這四種安全級別的詳細信息,請查看相關文檔。
password server = ServerIP
設定了用戶賬號認證伺服器IP,其在設定security = server時有效。
encrypt passwords = yes | no
設定是否對密碼進行加密。如果不對密碼進行加密的話,在認證會話期間,客戶端與伺服器傳遞的是明文密碼。但有些Windows系統預設情況下,不支持明文密碼傳輸。
passdb backend = smbpasswd | tdbsam | ldapsam
設定samba伺服器訪問和存儲samba用戶賬號的後端,在samba-3.0。23之前的預設值為smbpasswd,而之後的預設值為tdbsam。
smb passwd file =
設定samba的用戶賬號文件。對於源代碼安裝的samba,在samba-3.0.23之前,其預設值為/user/local/samba /private/smbpasswd;而samba-3.0.23之後,其預設值為/usr/local/samba/private /passwd.tdb。
include = smbconfFile
通過include選項可以包含其他配置文件,通過該選項和一些samba定義的變數可以設定與不同機器相關的配置。
local master = yes | no
設定該samba伺服器是否試圖成為本地主瀏覽器,預設值為yes。若設置為no,則該samba伺服器永遠不可能成為本地主瀏覽器,而設置為yes不代表其一定能成為本地主瀏覽器,只是讓其能參與本地主瀏覽器的選舉。
os level = N
N是一個整數,設定了該samba伺服器參加本地主瀏覽器選舉時的權重,其值越大,權重越大。os level = 0時,該伺服器將失去選舉的機會。
domain master = yes | no
設定samba伺服器成為域瀏覽器。域瀏覽器從各個本地主瀏覽器處獲取瀏覽列表,並將整個域的瀏覽列表傳遞給各個本地主瀏覽器。
preferred master = yes | no
設定該samba伺服器是否為工作組裡的首要主瀏覽器,如果設置為yes,則在nmbd啟動時,將強制一個瀏覽選擇。
局部選項:
局部選項為除了global外的各個<section>中的參數。其定義了共用服務的屬性。
comment =
設定共用服務的描述信息。
path =
設定共用服務的路徑,其中可以結合samba預定義的變數來設置。
hosts allow = host(subnet)
hosts deny = host(subnet)
與全局的hosts allow和hosts deny含義相同,其會覆蓋全局的設置。
read only = yes | no
設定該共用服務是否為只讀,該選項有一個同義選項writeable。
user = user(@group)
設定所有可能使用該共用服務的用戶,可以使用@group來設置群組group中的所有用戶賬號。該選項的值為列表,不同的項目之間使用空格或逗號 隔開。在設置security = share時,客戶端要訪問某共用服務時提供的密碼會與該選項指定的所有用戶進行一一配對認證,若某用戶認證通過,則以該用戶許可權進行共用服務訪問,否則 拒絕客戶端的訪問(設置security = share不是允許游客訪問,只有guest ok = yes才是允許游客訪問,切記!!!)。
valid users = user(@group)
設定能夠使用該共用服務的用戶和組,其值的格式與user選項一樣。
invalid users = user(@group)
設定不能夠使用該共用服務的用戶和組,其值的格式與user選項一樣。
read list = user(@group)
設定對該共用服務只有讀取許可權的用戶和組,其值的格式與user選項一樣。
write list = user(@group)
設定對該共用服務擁有讀寫許可權的用戶和組,其值的格式與user選項一樣。
admin list = user(@group)
設定對該共用服務擁有管理許可權的用戶和組,其值的格式與user選項一樣。
public = yes | no
設定該共用服務是否能夠被游客訪問,其同義選項有guest ok。
create mode = mode
mode為八進位值,如0755,其預設值為0744。該選項指定的值用於過濾新建文件的訪問許可權,新建文件的預設許可權將與create mode指定的值進行按位與操作,將結果再與force create mode指定的值進行按位或操作,得到的結果即為新建文件的訪問許可權。
force create mode = mode
mode為八進位值,預設為0000。其作用參考選項create mode。
directory mode = mode
mode為八進位值,預設為0755。該選項指定的值用於過濾新建目錄的訪問許可權,新建目錄的預設許可權將與directory mode指定的值進行按位與操作,將結果再與force directory mode指定的值進行按位或操作,得到的結果即為新建目錄的訪問許可權。
force directory mode = mode
mode為八進位值,預設為0000。該選項的作用參考選項directory mode。
force user = user
強制設定新建文件的屬性onwer。若存在一個目錄,其允許guest可以寫,則guest就可以刪除。但設定force user為其他用戶,並設置create mode = 0755,則gues用戶不能夠刪除其新建文件。
三.新建共用目錄
#mkdir /XXXX/shareimg
#chmod 777 /XXXX/shareimg //讓所有用戶具有完全許可權(預設用戶為root)
四.將root用戶加入smb的用戶列表中
#smbpasswd –a root //將root用戶添加為samba用戶,需設置訪問密碼
或者可以新建一個用戶
#useradd cc //添加cc用戶
#passwd cc //設置cc用戶的口令
如果用新用戶,需修改共用文件夾所有者
chown -R cc.cc /XXXX/shareimg
並且修改smb.conf中的valid users = cc
#smbpasswd –a cc //將cc用戶添加為samba用戶,需設置訪問密碼
五.啟動服務
設置開機自啟動:
chkconfig --level 2345 smb on
chkconfig --level 2345 nmb on
service smb start
service nmb start
在下麵問題修複後請重啟服務:
service smb restart
service nmb restart
另:需在開機啟動腳本/etc/rc.d/init.d/smb下添加一句話來防止啟動服務時無法訪問文件夾
……………
start() {
KIND="SMB"
echo -n $"Starting $KIND services: "
setenforce 0 (加上此句)
daemon smbd $SMBDOPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/smb || \
RETVAL=1
return $RETVAL
}
…………
開機自啟動存在問題!!!
六.連接
Windows下:\\ip地址\public
七.問題
(1)可以登錄samba伺服器,但是沒有許可權訪問linux下的共用目錄
1、確保linux下防火牆關閉或者是開放共用目錄許可權 iptalbes -F
2、確保samba伺服器配置文件smb.conf設置沒有問題,可網上查閱資料看配置辦法
3、確保setlinux關閉,可以用setenforce 0命令執行。
預設的,SELinux禁止網路上對Samba伺服器上的共用目錄進行寫操作,即使你在smb.conf中允許了這項操作。
這兩個命令必須執行:
iptables -F
setenforce 0
(2)windows 刪除共用緩存
C:\Documents and Settings\Administrator>net use
會記錄新的網路連接。
狀態 本地 遠程
網路
-------------------------------------------------------------------------------
OK Z:
\\192.168.31.85\chrishome Microsoft Windows Network
OK
\\192.168.31.88\dev-home Microsoft Windows Network
命令成功完成。
C:\Documents and Settings\Administrator>net use \\192.168.31.88\dev-home
/delete
\\192.168.31.88\dev-home 已經刪除。
八.基於SMB/JCIFS協議的共用文件上傳和下載(用於測試)
1 package com.smb; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.OutputStream; 11 12 import jcifs.smb.SmbFile; 13 import jcifs.smb.SmbFileInputStream; 14 import jcifs.smb.SmbFileOutputStream; 15 16 public class Smbtest { 17 /** 18 * 從區域網中共用文件中得到文件並保存在本地磁碟上 19 * @param remoteUrl 共用電腦路徑 如:smb//administrator:[email protected]/smb/1221.zip , smb為共用文件 20 * 註:如果一直出現連接不上,有提示報錯,並且錯誤信息是 用戶名活密碼錯誤 則修改共用機器的文件夾選項 查看 去掉共用簡單文件夾的對勾即可。 21 * @param localDir 本地路徑 如:D:/ 22 */ 23 public static void smbGet(String remoteUrl,String localDir){ 24 InputStream in = null; 25 OutputStream out = null; 26 try { 27 SmbFile smbFile = new SmbFile(remoteUrl); 28 String fileName = smbFile.getName(); 29 File localFile = new File(localDir+File.separator+fileName); 30 in = new BufferedInputStream(new SmbFileInputStream(smbFile)); 31 out = new BufferedOutputStream(new FileOutputStream(localFile)); 32 byte []buffer = new byte[1024]; 33 while((in.read(buffer)) != -1){ 34 out.write(buffer); 35 buffer = new byte[1024]; 36 } 37 } catch (Exception e) { 38 e.printStackTrace(); 39 }finally{ 40 try { 41 out.close(); 42 in.close(); 43 } catch (IOException e) { 44 e.printStackTrace(); 45 } 46 } 47 } 48 /** 49 * 把本地磁碟中的文件上傳到區域網共用文件下 50 * @param remoteUrl 共用電腦路徑 如:smb//administrator:[email protected]/smb 51 * @param localFilePath 本地路徑 如:D:/ 52 */ 53 public static void smbPut(String remoteUrl,String localFilePath){ 54 InputStream in = null; 55 OutputStream out = null; 56 try { 57 File localFile = new File(localFilePath); 58 String fileName = localFile.getName(); 59 SmbFile remoteFile = new SmbFile(remoteUrl+"/"+fileName); 60 in = new BufferedInputStream(new FileInputStream(localFile)); 61 out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile)); 62 byte[] buffer = new byte[1024]; 63 while((in.read(buffer)) != -1){ 64 out.write(buffer); 65 buffer = new byte[1024]; 66 } 67 } catch (Exception e) { 68 e.printStackTrace(); 69 }finally{ 70 try { 71 out.close(); 72 in.close(); 73 } catch (IOException e) { 74 e.printStackTrace(); 75 } 76 } 77 } 78 79 public static void main(String[] args) { 80 smbPut("smb://root:[email protected]/public", "E:/img/11.tmp"); 81 smbGet("smb://root:[email protected]/public/1.jpg ", "E:/"); 82 83 } 84 85 }View Code
九.Web伺服器訪問外部文件夾
Jsp:
1 <h1>請求圖片</h1> 2 3 <form name="userForm3" action="http://localhost:8080/naxincameraserver-war/userInfo/showPic" enctype="multipart/form-data" method="post"> 4 5 <input type="text" name="pic" /><br/> 6 7 <input type="submit" value="上傳"> 8 9 </form>View Code
Servlet:
Action中:(springMVC+spring+mybatis)
1 @RequestMapping(value="/showPic",method = RequestMethod.POST) 2 3 @ResponseBody 4 5 public void showPicture(HttpServletRequest request,HttpServletResponse response){ 6 7 String url = request.getParameter("pic"); 8 9 System.out.println(url+"------------"); 10 11 response.setContentType("image/jpg"); //設置返回的文件類型 12 13 try { 14 15 OutputStream toClient=response.getOutputStream(); 16 17 SmbFiles.smbGet(url, "E:/",toClient); 18 19 } catch (IOException e) { 20 21 // TODO Auto-generated catch block 22 23 e.printStackTrace(); 24 25 } 26 27 }View Code
修改Smbtest類:
1 /** 2 3 * 從區域網中共用文件中得到文件並保存在本地磁碟上 4 5 * @param remoteUrl 共用電腦路徑 如:smb//administrator:[email protected]/smb/1221.zip , smb為共用文件 6 7 * 註:如果一直出現連接不上,有提示報錯,並且錯誤信息是 用戶名活密碼錯誤 則修改共用機器的文件夾選項 查看 去掉共用簡單文件夾的對勾即可。 8 9 * @param localDir 本地路徑 如:D:/ 10 11 */ 12 13 public static void smbGet(String remoteUrl,String localDir,OutputStream toClient){ 14 15 InputStream in = null; 16 17 OutputStream out = null; 18 19 try { 20 21 SmbFile smbFile = new SmbFile(remoteUrl); 22 23 String fileName = smbFile.getName(); 24 25 File localFile = new File(localDir+File.separator+fileName); 26 27 in = new BufferedInputStream(new SmbFileInputStream(smbFile)); 28 29 out = new BufferedOutputStream(new FileOutputStream(localFile)); 30 31 byte []buffer = new byte[1024]; 32 33 while((in.read(buffer)) != -1){ 34 35 out.write(buffer); 36 37 toClient.write(buffer); 38 39 buffer = new byte[1024]; 40 41 } 42 43 } catch (Exception e) { 44 45 e.printStackTrace(); 46 47 }finally{ 48 49 try { 50 51 out.close(); 52 53 in.close(); 54 55 toClient.close(); 56 57 } catch (IOException e) { 58 59 e.printStackTrace(); 60 61 } 62 63 } 64 65 }View Code