一、創(chuàng)建linux維護用戶
創(chuàng)新互聯公司專業(yè)為企業(yè)提供福州網站建設、福州做網站、福州網站設計、福州網站制作等企業(yè)網站建設、網頁設計與制作、福州企業(yè)網站模板建站服務,10年福州做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。
登錄root用戶
創(chuàng)建新用戶
useradd 新用戶名
設置用戶密碼
passwd 新用戶密碼
二、安裝jdk和配置環(huán)境變量
建議在root用戶下直接安裝jdk,并直接配置環(huán)境變量,同時給非root用戶設置讀和執(zhí)行權限
解壓包
tar xvf jdk包名.tar
配置全局變量
編輯/etc/profile文件
vi /etc/profile
按I鍵,切換成編輯模式。
在文件未加入一下配置
export JAVA_HOME=jdk的解壓文件目錄
export JRE_HOME=jdk的解壓文件目錄/jre
export?CLASSPATH=.:${JAVA_HOME}/lib:${?JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${?JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
保存并退出
Esc ??
:wq
重載配置文件使其生效
source /etc/profile
檢查是否安裝成功
Javac
Java version
權限修改
讀4寫2執(zhí)行1,順序所有者、組成員、其他用戶
Chomd ?755 ?jdk的解壓文件目錄
三、安裝tomcat
安裝tomcat和放入war包使用非root的維護用戶
如果使用root安裝的話記得設置權限。( chomd -r 外層文件目錄 )
su - 用戶名
1、解壓包
tar ?xvf ?tomcat包名.tar
2、將war包放入tomcat/webapps目錄下
3、Tomcat啟動服務和停止服務
查看進程
ps -ef | grep java
啟動應用
Tomcat bin目錄下.startup.sh
停止應用
建議使用
Kill -9 進程號
注:解壓出應用文件后,注意配置信息的修改
四、IBM MQ部署 (7.5之后的版本)
(以下是使用9.0版本的正確部署命令)
一、 卸載舊版本IBM MQ (可選)
因為部署環(huán)境沒有安裝過mq,卸載這部分命令我沒有親自測試過
設置環(huán)境
以用戶身份登錄到組mqm,找到mq的安裝位置 /opt/mqm
source ./setmqenv -s
查看隊列管理器的狀態(tài)
dspmq -o installation
停止與要卸載的安裝關聯的所有正在運行的隊列管理器
endmqm SXRECV
停止與隊列管理器關聯的所有偵聽器。
endmqlsr -m SXRECV
查看系統(tǒng)上當前安裝的軟件包(組件)
sudo rpm -qa | grep MQSeries
列出軟件包并一次性卸載
sudo rpm -qa | grep MQSeries | xargs rpm -ev
再將對應的用戶及安裝目錄給刪除
rm -rf /opt/mqm
userdel -r mqm
檢查MQ license
license文件在安裝目錄中 /opt/mqm/lib 可以找到
amqtcert.lic - is a trial license
amqbcert.lic - is a beta license
amqpcert.lic - is the production license
——————————————————————————————————————
二、安裝新版本ibm mq
解壓,解壓文件都在MQServer中
tar –xzvf IBM_MQ_9.1.5_LINUX_X86-64.tar.gz
進入MQServer文件夾中:
cd MQServer/
運行MQ許可證程序
./mqlicense.sh
安裝WebSphere MQ for Linux服務器(Runtime、SDK 和 Server 軟件包):
rpm -U MQSeriesRuntime-9.1.5-0.x86_64.rpm
rpm -U MQSeriesSDK-9.1.5-0.x86_64.rpm
rpm -U MQSeriesServer-9.1.5-0.x86_64.rpm
安裝WebSphere MQ for Linux客戶機:
rpm -U MQSeriesClient-9.0.0-0.x86_64.rpm
安裝WebSphere MQ樣本程序:
rpm -U MQSeriesSamples-9.0.0-0.x86_64.rpm
創(chuàng)建組和用戶
安裝過程創(chuàng)建了一個名為mqm的用戶和一個同樣名為 mqm 的組。設置一個密碼來解鎖。
passwd mqm
——————————————————————————————————————
三、 配置
(這部分隊列管理器、通道、隊列等根據實際情況自行配置)
切換用戶:
su mqm
創(chuàng)建隊列管理器
使用crtmqm命令來創(chuàng)建一個名為 SXRECV
的隊列管理器。我們把它作為缺省隊列,并且將不在創(chuàng)建時指定死信隊列。然后使用strmqm命令啟動隊列管理器。
crtmqm -q ?SXRECV
strmqm ?SXRECV
——————
如果執(zhí)行crtmqm命令時提示
-bash-3.2$ crtmqm
-bash: crtmqm: command not found
find / -name crtmqm
則需要配置mqm用戶的環(huán)境變量,編輯如下文件,并添加下面的內容,如下:
第一種方法:相對第二種較安全僅對mqm用戶有效
方法一:
(1) -bash-3.2$ vi /var/mqm/.bash_profile --有可能會在文件夾下看不到這個文件,通過編輯即可看到
PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin
(2)執(zhí)行“.”命令,使這個文件生效
-bash-3.2$ source ?.bash_profile
(3)再次嘗試實行crtmqm或是dspmqm命令,即可發(fā)現已經生效。
方法二:
( 1)
su ?root
[if !supportLists](2)[endif]
vim /etc/profile
[if !supportLists](3)[endif] 在最后面加上:
PATH=$PATH:/opt/mqm/samp/bin:/opt/mqm/bin:bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/bin
( 4)關閉遠程終端重新打開,無需重啟服務器
——————
運行隊列管理器
runmqsc SXRECV
創(chuàng)建通道和隊列
DEFINE QLOCAL (XYDATA) REPLACE USAGE (NORMAL) DEFPSIST (YES) MAXDEPTH (300000) DESCR('興業(yè)銀行')
DEFINE QLOCAL (XYTRANS) REPLACE USAGE (XMITQ) DEFPSIST (YES) MAXDEPTH (300000) DESCR('興業(yè)銀行')
DEFINE QREMOTE (XYACK) REPLACE DEFPSIST (YES) RQMNAME (SXSEND) ?RNAME (XYACK) XMITQ (XYTRANS) DESCR('XXXX')
DEFINE CHANNEL (XYDATA) CHLTYPE (RCVR) TRPTYPE (TCP) REPLACE DESCR('XXXX')
DEFINE CHANNEL (XYACK) CHLTYPE (SDR) CONNAME ('166.1.1.8(2214)') XMITQ (XYTRANS) TRPTYPE (TCP) DISCINT (0) CONVERT (NO) SHORTRTY (30) SHORTTMR (10) LONGRTY (999999999) LONGTMR (20) REPLACE DESCR('XXXX')
DEFINE CHANNEL (SVRCONN) CHLTYPE (SVRCONN) MCAUSER('mqm')
創(chuàng)建監(jiān)聽
DEFINE LISTENER (RECLISTENER) TRPTYPE (TCP) CONTROL(QMGR) PORT (2214)
啟動監(jiān)聽
start LISTENER(RECLISTENER)
啟動通道
start channel(SVRCONN)
start channel(XYDATA)
start channel(XYACK)
———————————————————————————————————————————————————
四、2035錯誤碼 說明
如果程序連接mq報錯2035,則需要對權限認證做設置,則進行以此操作
1、
ALTER QMGR CHLAUTH(DISABLED)
2、
ALTER CHL(通道名) CHLTYPE(SVRCONN) MCAUSER('mqm')
3、
ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)
或者直接將連接認證選項置為空,將其完全關閉,指令如下:
ALTER QMGR CONNAUTH('')
在執(zhí)行完上述兩條命令中的任一條后,都需要刷新連接認證的緩存,指令如下:
REFRESH SECURITY TYPE(CONNAUTH)
五、mq操作命令
一、MQ的啟動與停止
1、MQ的啟動
strmqm QMgrName
如果啟動默認隊列管理器,strmqm后可以忽略隊列管理器名稱。
2、MQ的關閉
endmqm?-i?QMgrName
停止mq
二、MQ運行狀態(tài)查看與常用操作
1、 查看隊列管理器運行狀態(tài)
su mqm
執(zhí)行如下命令檢查隊列管理器運行狀態(tài):dspmq顯示結果中QMNAME表示MQ隊列管理器的名稱,STATUS表示當前運行狀態(tài)。運行狀態(tài)有如下幾種:Starting正在啟動Running正在運行Ending正在停止Ended normally已經正常終止Ended immediately已經立即終止Ended preemtively已經強制終止Ended unexpectively異常終止
注意:停止MQ后必須使用dspmq命令進行狀態(tài)檢查
2、查看通道運行狀態(tài)與啟停通道
runmqsc
dis chl(*);查看所有通道定義
dis chs(*);查看所有通道狀態(tài),如果沒有查詢到通道狀態(tài),或報錯AMQ8420: Channel Status not found,請啟動通道
dis chs(ChannelName); 查看通道ChannelName的狀態(tài)
通道狀態(tài)有如下幾種:
STARTING正在啟動BINDING正在綁定INITIALIZING正在初始化RUNNING正常STOPPING?正在停止RETRYING重試PAUSED等待STOPPED已停止REQUESTING請求
start?chl(ChannelName);啟動通道
stop?chl(ChannelName);停止通道
* 重置通道
reset channel(ChannelName);?重置通道序號。當本地與其他MQ隊列管理器的通道無法正常啟動的情況,檢查日志發(fā)現是通道序號不一致,此時就需要先停止發(fā)送方通道,清空隊列深度并在發(fā)送方和接收方進行通道計數的重置,重置后啟動通道即可恢復通訊。
注意:重置成功mq序列號一般相同或相差1
3、查看通道監(jiān)聽狀態(tài)與啟停監(jiān)聽
runmqsc
dis listner(*);查看通道監(jiān)聽定義
dis lsstatu(listnerName);查看監(jiān)聽狀態(tài)
start?lstr(listnerName); 啟動監(jiān)聽
stop?lstr(listnerName); 停止監(jiān)聽?
4、查看隊列深度
runmqsc
dis q(*);查看所有各類隊列的屬性
dis?qlocal(QName);查看所有本地隊列的屬性
隊列深度屬性為:CURDEPTH
查看隊列深度display ql('隊列名') ?curdepth
*清空隊列深度
清空隊列深度
clear ql(‘隊列名’)
三、MQ發(fā)送和接收消息
su mqm
發(fā)送消息
amqsput ?隊列名 ?隊列管理器
獲取消息
amqsget ?隊列名 ?隊列管理器
可通過配合查看隊列深度命令,完成mq的聯調
六、其他維護中常用linux命令
1、測試端口連接
telnet ip port
2、查看已啟動的端口
netstat -an | grep 端口號
3、查看應用進程
ps -ef |grep java
4、修改權限
chomd ?XXX(對應的權限) ?文件目錄
5、修改文件或目錄下所有文件所有者和組
Chomd -R 用戶名:組名 ?文件目錄
6、查看目錄內容
ls 或者ls -l (簡寫ll)
7、查看文件輸出
cat 目錄/文件名
或者
Vi 目錄/文件名 按i可進入編輯
按 G 到文檔末尾
按 gg 到文件首行
不保存退出
Esc ??:q!
保存退出
Esc ??:wq
vi 進入文檔文檔后查找關鍵字
Esc 進入命令行
/關鍵字
按n向下繼續(xù)查找
按N向上繼續(xù)查找
8、殺進程
Kill -9 進程號
9、復制
cp -r 源目錄 ?目標目錄
10、移動
mv ?-i 源文件或目錄 目標文件或目錄
11、刪除
rm -R 文件目錄
12、 切換工作目錄
cd ?相對路徑或絕對路徑
~也表示為 home 目錄 的意思, . 則是表示目前所在的目錄, .. 則表示目前目錄位置的上一層目錄。
鎖用戶的設定
/etc/pam.d/下包含各種認證程序或服務的配置文件。編輯這些可限制認證失敗次數,當失敗次數超過指定值時用戶會被鎖住。
在此,以run
level為3的時候,多次登錄登錄失敗即鎖用戶為例:
在/etc/pam.d/login文件中追加如下兩行:
auth
required
/lib/security/pam_tally.so
onerr=fail
no_magic_root
account
required
/lib/security/pam_tally.so
deny=3
no_magic_root
reset
deny=3
設置登錄失敗3次就將用戶鎖住,該值可任意設定。
如下為全文見設定例:
auth
required
pam_securetty.so
auth
required
pam_stack.so
service=system-auth
auth
required
pam_nologin.so
auth
required
pam_tally.so
onerr=fail
no_magic_root
account
required
pam_stack.so
service=system-auth
account
required
pam_tally.so
deny=3
no_magic_root
reset
password
required
pam_stack.so
service=system-auth
session
required
pam_stack.so
service=system-auth
session
optional
pam_console.so
這樣當用戶在run
level=3的情況下登錄時,/var/log/faillog會自動生成,裏面記錄用戶登錄失敗次數等信息。
可用"faillog
-u
用戶名"命令來查看。
當用戶登錄成功時,以前的登錄失敗信息會重置。
2)用戶的解鎖
用戶因多次登錄失敗而被鎖的情況下,可用faillog命令來解鎖。具體如下:
faillog
-u
用戶名
-r
此命令實行后,faillog里記錄的失敗信息即被重置,用戶又可用了。
關於faillog的其他命令。。參見man
failog。
二:手動鎖定用戶禁止使用
可以用usermod命令來鎖定用戶密碼,使密碼無效,該用戶名將不能使用。
如:
usermod
-L
用戶名
解鎖命令:usermod
-U
用戶名
......
要想強制用戶下次登錄更改密碼就使用chage
-d
username
強制把上次更改密碼的日期歸零.
定義用戶密碼變更天數在/etc/shadow
這個文件中定義
對新建的用戶在/etc/login.defs這個文件中定義
pam_tally2模塊(方法一)
用于對系統(tǒng)進行失敗的ssh登錄嘗試后鎖定用戶帳戶。此模塊保留已嘗試訪問的計數和過多的失敗嘗試。
配置
使用 /etc/pam.d/system-auth 或 /etc/pam.d/password-auth 配置文件來配置的登錄嘗試的訪問
注意:
auth要放到第二行,不然會導致用戶超過3次后也可登錄。
如果對root也適用在auth后添加 even_deny_root .
auth required pam_tally2.so deny=3 even_deny_root unlock_time=600
pam_tally2命令
查看用戶登錄失敗的信息
解鎖用戶
pam_faillock 模塊(方法二)
在紅帽企業(yè)版 Linux 6 中, pam_faillock PAM 模塊允許系統(tǒng)管理員鎖定在指定次數內登錄嘗試失敗的用戶賬戶。限制用戶登錄嘗試的次數主要是作為一個安全措施,旨在防止可能針對獲取用戶的賬戶密碼的暴力破解
通過 pam_faillock 模塊,將登錄嘗試失敗的數據儲存在 /var/run/faillock 目錄下每位用戶的獨立文件中
配置
添加以下命令行到 /etc/pam.d/system-auth 文件和 /etc/pam.d/password-auth 文件中的對應區(qū)段:
auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=3
account required pam_faillock.so
注意:
auth required pam_faillock.so preauth silent audit deny=3 必須在最前面。
適用于root在 pam_faillock 條目里添加 even_deny_root 選項
faillock命令
查看每個用戶的嘗試失敗次數
$ faillock
test:
When Type Source Valid
2017-06-20 14:29:05 RHOST 192.168.56.1 V
2017-06-20 14:29:14 RHOST 192.168.56.1 V
2017-06-20 14:29:17 RHOST 192.168.56.1 V
解鎖一個用戶的賬戶
一、什么是文件鎖定
對于鎖這個字,大家一定不會陌生,因為我們生活中就存在著大量的鎖,它們各個方面發(fā)揮著它的作用,現在世界中的鎖的功能都可歸結為一句話,就是阻止某些人做某些事,例如,門鎖就是阻止除了屋主之外的人進入這個房子,你進入不到這個房子,也就不能使用房子里面的東西。
而因為程序經常需要共享數據,而這通常又是通過文件來實現的,試想一個情況,A進程正在對一個文件進行寫操作,而另一個程序B需要對同一個文件進行讀操作,并以讀取到的數據作為自己程序運行時所需要的數據,這會發(fā)生什么情況呢?進程B可能會讀到錯亂的數據,因為它并不知道另一個進程A正在改寫這個文件中的數據。
為了解決類似的問題,就出現了文件鎖定,簡單點來說,這是文件的一種安全的更新方式,當一個程序正在對文件進行寫操作時,文件就會進入一種暫時狀態(tài),在這個狀態(tài)下,如果另一個程序嘗試讀這個文件,它就會自動停下來等待這個狀態(tài)結束。Linux系統(tǒng)提供了很多特性來實現文件鎖定,其中最簡單的方法就是以原子操作的方式創(chuàng)建鎖文件。
用回之前的例子就是,文件鎖就是當文件在寫的時候,阻止其他的需要寫或者要讀文件的進程來操作這個文件。
二、創(chuàng)建鎖文件
創(chuàng)建一個鎖文件是非常簡單的,我們可以使用open系統(tǒng)調用來創(chuàng)建一個鎖文件,在調用open時oflags參數要增加參數O_CREAT和O_EXCL標志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以創(chuàng)建一個鎖文件/tmp/LCK.test。O_CREAT|O_EXCL,可以確保調用者可以創(chuàng)建出文件,使用這個模式可以防止兩個程序同時創(chuàng)建同一個文件,如果文件(/tmp/LCK.test)已經存在,則open調用就會失敗,返回-1。
如果一個程序在它執(zhí)行時,只需要獨占某個資源一段很短的時間,這個時間段(或代碼區(qū))通常被叫做臨界區(qū),我們需要在進入臨界區(qū)之前使用open系統(tǒng)調用創(chuàng)建鎖文件,然后在退出臨界區(qū)時用unlink系統(tǒng)調用刪除這個鎖文件。
注意:鎖文件只是充當一個指示器的角色,程序間需要通過相互協作來使用它們,也就是說鎖文件只是建議鎖,而不是強制鎖,并不會真正阻止你讀寫文件中的數據。
可以看看下面的例子:源文件文件名為filelock1.c,代碼如下:
#include unistd.h #include stdlib.h #include stdio.h #include fcntl.h #include errno.h int main() { const char *lock_file = "/tmp/LCK.test1"; int n_fd = -1; int n_tries = 10; while(n_tries--) { //創(chuàng)建鎖文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //創(chuàng)建失敗 printf("%d - Lock already present ", getpid()); sleep(2); } else { //創(chuàng)建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //刪除鎖文件,釋放鎖 unlink(lock_file); sleep(2); } } return 0; }
同時運行同一個程序的兩個實例,運行結果為:
?
從運行的結果可以看出兩個程序交叉地對對文件進行鎖定,但是真實的操作卻是,每次調用open函數去檢查/tmp/LCK.test1這個文件是否存在,如果存在open調用就失敗,顯示有進程已經把這個文件鎖定了,如果這個文件不存在,就創(chuàng)建這個文件,并顯示許可信息。但是這種做法有一定的缺憾,我們可以看到文件/tmp/LCK.test1被創(chuàng)建了很多次,也被unlink刪除了很多次,也就是說我們不能使用已經事先有數據的文件作為這種鎖文件,因為如果文件已經存在,則open調用總是失敗。
給我的感覺是,這更像是一種對進程工作的協調性安排,更像是二進制信號量的作用,文件存在為0,不存在為1,而不是真正的文件鎖定。
三、區(qū)域鎖定
我們還有一個問題,就是如果同一個文件有多個進程需要對它進行讀寫,而一個文件同一時間只能被一個進程進行寫操作,但是多個進程讀寫的區(qū)域互不相關,如果總是要等一個進程寫完其他的進程才能對其進行讀寫,效率又太低,那么是否可以讓多個進程同時對文件進行讀寫以提高數據讀寫的效率呢?
為了解決上面提到的問題,和出現在第二點中的問題,即不能把文件鎖定到指定的已存在的數據文件上的問題,我們提出了一種新的解決方案,就是區(qū)域鎖定。
簡單點來說,區(qū)域鎖定就是,文件中的某個部分被鎖定了,但其他程序可以訪問這個文件中的其他部分。
然而,區(qū)域鎖定的創(chuàng)建和使用都比上面說的文件鎖定復雜很多。
1、創(chuàng)建區(qū)域鎖定
在Linux上為實現這一功能,我們可以使用fcntl系統(tǒng)調用和lockf調用,但是下面以fcntl系統(tǒng)調用來講解區(qū)域鎖定的創(chuàng)建。
fctnl的函數原理為:
int fctnl(int fildes, int command, ...);
它對一個打開的文件描述進行操作,并能根據command參數的設置完成不同的任務,它有三個可選的任務:F_GETLK,F_SETLK,F_SETLKW,至于這三個參數的意義下面再詳述。而當使用這些命令時,fcntl的第三個參數必須是一個指向flock結構的指針,所以在實際應用中,fctnl的函數原型一般為:int fctnl(int fildes, int command, struct flock *flock_st);
2、flock結構
準確來說,flock結構依賴具體的實現,但是它至少包括下面的成員:
short l_type;文件鎖的類型,對應于F_RDLCK(讀鎖,也叫共享鎖),F_UNLCK(解鎖,也叫清除鎖),F_WRLCK(寫鎖,也叫獨占鎖)中的一個。
short l_whence;從文件的哪個相對位置開始計算,對應于SEEK_SET(文件頭),SEEK_CUR(當前位置),SEEK_END(文件尾)中的一個。
off_t l_start;從l_whence開始的第l_start個字節(jié)開始計算。
off_t l_len;鎖定的區(qū)域的長度。
pid_t l_pid;用來記錄參持有鎖的進程。
成員l_whence、l_start和l_len定義了一個文件中的一個區(qū)域,即一個連續(xù)的字節(jié)集合,例如:
struct flock region;
region.l_whence = SEEK_SET;
region.l_start = 10;
region.l_len = 20;
則表示fcntl函數操作鎖定的區(qū)域為文件頭開始的第10到29個字節(jié)之間的這20個字節(jié)。
3、文件鎖的類型
從上面的flock的成員l_type的取值我們可以知道,文件鎖的類型主要有三種,這里對他們進行詳細的解說。
F_RDLCK:
從它的名字我們就可以知道,它是一個讀鎖,也叫共享鎖。許多不同的進程可以擁有文件同一(或重疊)區(qū)域上的讀(共享)鎖。而且只要任一進程擁有一把讀(共享)鎖,那么就沒有進程可以再獲得該區(qū)域上的寫(獨占)鎖。為了獲得一把共享鎖,文件必須以“讀”或“讀/寫”方式打開。
簡單點來說就是,當一個進程在讀文件中的數據時,文件中的數據不能被改變或改寫,這是為了防止數據被改變而使讀數據的程序讀取到錯亂的數據,而文件中的同一個區(qū)域能被多個進程同時讀取,這是容易理解的,因為讀不會破壞數據,或者說讀操作不會改變文件的數據。
F_WRLCK:
從它的名字,我們就可以知道,它是一個寫鎖,也叫獨占鎖。只有一個進程可以在文件中的任一特定區(qū)域擁有一把寫(獨占)鎖。一旦一個進程擁有了這樣一把鎖,任何其他進程都無法在該區(qū)域上獲得任何類型的鎖。為了獲得一把寫(獨占)鎖,文件也必須以“讀”或“讀/寫”方式打開。
簡單點來說,就是一個文件同一區(qū)域(或重疊)區(qū)域進在同一時間,只能有一個進程能對其進行寫操作,并且在寫操作進行期間,其他的進程不能對該區(qū)域進行讀取數據。這個要求是顯然易見的,因為如果兩個進程同時對一個文件進行寫操作,就會使文件的內容錯亂起來,而由于寫時會改變文件中的數據,所以它也不允許其他進程對文件的數據進行讀取和刪除文件等操作。
F_UNLCK:
從它的名字就可以知道,它用于把一個鎖定的區(qū)域解鎖。
4、不同的command的意義
在前面說到fcntl函數的command參數時,說了三個命令選項,這里將對它們進行詳細的解說。
F_GETLK命令,它用于獲取fildes(fcntl的第一個參數)打開的文件的鎖信息,它不會嘗試去鎖定文件,調用進程可以把自己想創(chuàng)建的鎖類型信息傳遞給fcntl,函數調用就會返回將會阻止獲取鎖的任何信息,即它可以測試你想創(chuàng)建的鎖是否能成功被創(chuàng)建。fcntl調用成功時,返回非-1,如果鎖請求可以成功執(zhí)行,flock結構將保持不變,如果鎖請求被阻止,fcntl會用相關的信息覆蓋flock結構。失敗時返回-1。
所以,如果調用成功,調用程序則可以通過檢查flock結構的內容來判斷其是否被修改過,來檢查鎖請求能否被成功執(zhí)行,而又因為l_pid的值會被設置成擁有鎖的進程的標識符,所以大多數情況下,可以通過檢查這個字段是否發(fā)生變化來判斷flock結構是否被修改過。
使用F_GETLK的fcntl函數調用后會立即返回。
舉個例子來說,例如,有一個flock結構的變量,flock_st,flock_st.l_pid = -1,文件的第10~29個字節(jié)已經存在一個讀鎖,文件的第40~49個字節(jié)中已經存在一個寫鎖,則調用fcntl時,如果用F_GETLK命令,來測試在第10~29個字節(jié)中是否可以創(chuàng)建一個讀鎖,因為這個鎖可以被創(chuàng)建,所以,fcntl返回非-1,同時,flock結構的內容也不會改變,flock_st.l_pid = -1。而如果我們測試第40~49個字節(jié)中是否可以創(chuàng)建一個寫鎖時,由于這個區(qū)域已經存在一個寫鎖,測試失敗,但是fcntl還是會返回非-1,只是flock結構會被這個區(qū)域相關的鎖的信息覆蓋了,flock_st.l_pid為擁有這個寫鎖的進程的進程標識符。
F_SETLK命令,這個命令試圖對fildes指向的文件的某個區(qū)域加鎖或解鎖,它的功能根據flock結構的l_type的值而定。而對于這個命令來說,flock結構的l_pid字段是沒有意義的。如果加鎖成功,返回非-1,如果失敗,則返回-1。使用F_SETLK的fcntl函數調用后會立即返回。
F_SETLKW命令,這個命令與前面的F_SETLK,命令作用相同,但不同的是,它在無法獲取鎖時,即測試不能加鎖時,會一直等待直到可以被加鎖為止。
5、例子
看了這么多的說明,可能你已經很亂了,就用下面的例子來整清你的思想吧。
源文件名為filelock2.c,用于創(chuàng)建數據文件,并將文件區(qū)域加鎖,代碼如下:
#include unistd.h #include stdlib.h #include stdio.h #include fcntl.h int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開一個文件描述符 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //給文件添加100個‘A’字符的數據 for(byte_count = 0; byte_count 100; ++byte_count) { write(file_desc, byte_to_write, 1); } //在文件的第10~29字節(jié)設置讀鎖(共享鎖) region_1.l_type = F_RDLCK; region_1.l_whence = SEEK_SET; region_1.l_start = 10; region_1.l_len = 20; //在文件的40~49字節(jié)設置寫鎖(獨占鎖) region_2.l_type = F_WRLCK; region_2.l_whence = SEEK_SET; region_2.l_start = 40; region_2.l_len = 10; printf("Process %d locking file ", getpid()); //鎖定文件 res = fcntl(file_desc, F_SETLK, ?ion_1); if(res == -1) { fprintf(stderr, "Failed to lock region 1 "); } res = fcntl(file_desc, F_SETLK, ?ion_2); if(res == -1) { fprintf(stderr, "Failed to lock region 2 "); } //讓程序休眠一分鐘,用于測試 sleep(60); printf("Process %d closing file ", getpid()); close(file_desc); exit(EXIT_SUCCESS); }
下面的源文件filelock3.c用于測試上一個文件設置的鎖,測試可否對兩個區(qū)域都加上一個讀鎖,代碼如下:
#include unistd.h #include stdlib.h #include stdio.h #include fcntl.h int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開數據文件 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //設置區(qū)域1的鎖類型 struct flock region_test1; region_test1.l_type = F_RDLCK; region_test1.l_whence = SEEK_SET; region_test1.l_start = 10; region_test1.l_len = 20; region_test1.l_pid = -1; //設置區(qū)域2的鎖類型 struct flock region_test2; region_test2.l_type = F_RDLCK; region_test2.l_whence = SEEK_SET; region_test2.l_start = 40; region_test2.l_len = 10; region_test2.l_pid = -1; //
三、解空鎖問題
如果我要給在本進程中沒有加鎖的區(qū)域解鎖會發(fā)生什么事情呢?而如果這個區(qū)域中其他的進程有對其進行加鎖又會發(fā)生什么情況呢?
如果一個進程實際并未對一個區(qū)域進行鎖定,而調用解鎖操作也會成功,但是它并不能解其他的進程加在同一區(qū)域上的鎖。也可以說解鎖請求最終的結果取決于這個進程在文件中設置的任何鎖,沒有加鎖,但對其進行解鎖得到的還是沒有加鎖的狀態(tài)。
電腦上有各種各樣的密碼,那么這些電腦密碼忘記怎么解鎖呢?下面我就為大家一一介紹!
一、忘記開機密碼
開機密碼是指你在打開電腦開機自檢后就跳出的密碼。這時你只有輸入正確的密碼后練作系統(tǒng)才啟動。這種 密碼出現時,你就想進入電腦的BIOS設置都不行,所以安全性相對要好(建議筆記本電腦不要設置此類密碼。因為一旦忘記密碼,然后又丟了相應的解密盤的話,你可就要去筆記本產商維修店去燒錢了)。解決方法:打開機箱,把主板上的CMOS鋰電池取出來,過一會兒(5-10分鐘),再放進去,密碼自動消失。原理:因為開機密碼是通進BIOS設置的,它會保存在主板上CMOS中,這種存儲器在長時間掉電后內容會消失,所以密碼也隨之消失。
二、忘記BIOS設置密碼
BIOS設置密碼是在開機自檢過程中通過按相應鍵(不同BIOS的鍵不同,Aword、與AMI的為DEL)進入BIOS進行設置時的密碼,開機密碼也是的在這里邊設置的。此密碼是對BIOS設置的權限進行保護。不影響練作系統(tǒng)的啟動。解決方法:可以通過CMOS放電,但最好是用debug來清除它。因為總是翻弄電腦硬件,會使它的使用壽命更短。在啟動練作系統(tǒng)后,進入DOS環(huán)境,輸入debug命令,這時會出現“-”的輸入提示符,然后輸入以下命令
-o 70 10
-o 71 10
-q
相信通過此練作,就能清除密碼。
原理:命令行中都用到了70和71兩個數字,這是因為CMOS中數據訪問是通過70和71這兩個I/O端口來實現的。端口70H是一個字節(jié)的地址端口,用來設置CMOS中數據的地址,而端口71H則是用來讀寫端口70H設置CMOS地址中的數據單元內容。
三、忘記Windows XP登錄密碼
解決方法一、用net 命令(假設忘記密碼的用戶名為xxcxz)
我們知道在Windows XP中提供了“net user”命令,該命令可以添加、修改用戶賬戶信息,其語法格式為:
net user [UserName [Password | *] [options]] [/domain]
net user [UserName {Password | *} /add [options] [/domain]
net user [UserName [/] [/domain]]
1、重新啟動計算機,在啟動畫面出現后馬上按下F8鍵,選擇“帶命令行的安全模式”。
2、運行過程結束時,系統(tǒng)列出了系統(tǒng)超級用戶“administrator”和本地用戶“xxcxz”的選擇菜單,鼠標單擊“administrator”,進入命令行模式。
3、鍵入命令:“net user xxcxz 123456”,強制將“xxcxz”用戶的口令更改為“123456”。若想在此添加一新用戶(如:用戶名為abcdef,口令為123456)的話,請鍵入“net user abcdef 123456 /add”,添加后可用“net localgroup administrators abcdef /add”命令將用戶提升為系統(tǒng)管理組“administrators”的用戶,并使其具有超級權限。
4、重新啟動計算機,選擇正常模式下運行,就可以用更改后的口令“123456”登錄“xxcxz”用戶了。
解決方法二、利用“administrator”
我們知道在安裝Windows XP過程中,首先是以“administrator”默認登錄,然后會要求創(chuàng)建一個新賬戶,以便進入Windows XP時使用此新建賬戶登錄,而且在Windows XP的登錄界面中也只會出現創(chuàng)建的這個用戶賬號,不會出現“administrator”,但實際上該“administrator”賬號還是存在的,并且密碼為空。
當我們了解了這一點以后,假如忘記了登錄密碼的話,在登錄界面上,按住Ctrl+Alt鍵,再按住Del鍵二次,即可出現經典的登錄畫面,此時在用戶名處鍵入“administrator”,密碼為空進入,然后再修改“zhangbp”的口令即可。
四、忘記Linux root登錄密碼
linux是另一種與Microsoft練作系統(tǒng)大不相同的練作系統(tǒng),公司的服務器就是應用這個練作系統(tǒng)。它的具有較好的安全性,而且其內核是免費的,但練作稍微復雜。 root賬號 是Linux中默認的.練作系統(tǒng)管理員登錄密碼,相當于Microsft windowsNT/2K中的Administrator。以root命今登錄后具有很大的管理練作權限,既然能將root密碼都改掉,那么其它用戶密碼就更是”小菜一碟”。但是在更改密碼時必須重啟計算機,想Telnet一類方法可能就不能更改。
解決方法一. lilo
1. 在出現 lilo: 提示時鍵入 linux single
畫面顯示 lilo: linux single
2. 回車計算機啟動后可直接進入linux命令行
3. #vi /etc/shadow
將第一行,即以root開頭的一行中root:后和下一個:前的內容刪除,
第一行將類似于
root::......
保存
4. #reboot重啟,root密碼為空
解決方法二. grub
1. 在出現grub畫面時,用上下鍵選中你平時啟動linux的那一項(別選dos喲),然后按e鍵
2. 再次用上下鍵選中你平時啟動linux的那一項(類似于kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/),然后按e鍵
3. 修改你現在見到的命令行,加入single,結果如下:
kernel /boot/vmlinuz-2.4.18-14 single ro root=LABEL=/
4. 回車返回,然后按b鍵啟動,即可直接進入linux命令行
5. #vi /etc/shadow
將第一行,即以root開頭的一行中root:后和下一個:前的內容刪除, 第一行將類似于
root::......
保存
6. #reboot重啟,root密碼為空
解決方法三、將本機的硬盤拿下來,掛到其他的linux系統(tǒng)上,采用的辦法與第二種相同
原理:在LINUX練作系統(tǒng)中,各類文件都放在一個固定的目錄下(UNIX也是這樣),”/”就是根目錄,而練作系統(tǒng)登錄密碼就放在/etc目錄下,若登錄密碼經過加密的,就放在shadow文件中;而未經加密的就放于password文件中(因好久沒有用linux所以此文件名記得不太清楚)。找到相應的要改密的用戶命,在相應的項(因為此文件內容是以固定的格式放置的)上將密碼刪除即可。
首先,用root用戶登陸Linux系統(tǒng)或者使用su、sudo等命令提升到root權限。\x0d\x0a\x0d\x0a其次,修改帳戶密碼,只需要使用passwd命令即可,該命令詳細介紹如下:\x0d\x0a passwd 選項 用戶名\x0d\x0a可使用的選項:\x0d\x0a-l 鎖定口令,即禁用賬號。\x0d\x0a-u 口令解鎖。\x0d\x0a-d 使賬號無口令。\x0d\x0a-f 強迫用戶下次登錄時修改口令。\x0d\x0a如果默認用戶名,則修改當前用戶的口令。\x0d\x0a例如,假設當前用戶是sam,則下面的命令修改該用戶自己的口令:\x0d\x0a$ passwd\x0d\x0aOld password:******\x0d\x0aNew password:*******\x0d\x0aRe-enter new password:*******\x0d\x0a如果是超級用戶,可以用下列形式指定任何用戶的口令:\x0d\x0a# passwd sam\x0d\x0aNew password:*******\x0d\x0aRe-enter new password:*******\x0d\x0a普通用戶修改自己的口令時,passwd命令會先詢問原口令,驗證后再要求用戶輸入兩遍新口令,如果兩次輸入的口令一致,則將這個口令指定給用戶;而超級用戶為用戶指定口令時,就不需要知道原口令。\x0d\x0a為了系統(tǒng)安全起見,用戶應該選擇比較復雜的口令,例如最好使用8位長的口令,口令中包含有大寫、小寫字母和數字,并且應該與姓名、生日等不相同。\x0d\x0a為用戶指定空口令時,執(zhí)行下列形式的命令:\x0d\x0a# passwd -d sam\x0d\x0a此命令將用戶sam的口令刪除,這樣用戶sam下一次登錄時,系統(tǒng)就不再詢問口令。\x0d\x0apasswd命令還可以用-l(lock)選項鎖定某一用戶,使其不能登錄,例如:\x0d\x0a# passwd -l sam
網頁名稱:linux系統(tǒng)解鎖命令,linux用戶解鎖命令
URL分享:http://m.rwnh.cn/article40/phjheo.html
成都網站建設公司_創(chuàng)新互聯,為您提供企業(yè)網站制作、品牌網站設計、網站建設、關鍵詞優(yōu)化、網站內鏈、軟件開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯