您好,登錄后才能下訂單哦!
業(yè)務(wù)需求:收集項目需求信息,如操作系統(tǒng)日志、項目工程及項目工程日志、數(shù)據(jù)庫信息和數(shù)據(jù)。
環(huán)境:CentOS6.7 x86_64
程序流程:程序MyInfoCollector是一個信息采集程序,由另外一個進程MyMonitor守護執(zhí)行,MyInfoCollector程序收集信息不定,為避免后期新需求導(dǎo)致更改代碼,所以加入配置文件MyInfoCollector.xml,該配置文件配置執(zhí)行腳本路徑,程序運行自動調(diào)用腳本實現(xiàn)需求。
問題:My.sh:收集項目日志(MyInfoCollector.log),結(jié)果:成功!
System.sh:收集系統(tǒng)日志及數(shù)據(jù)庫日志(/var/log/messages*和/var/log/mysqld.log),結(jié)果:無效。
用戶名:adz,普通用戶,adz用戶組,不考慮將adz賦予更高的權(quán)限。
思考:權(quán)限問題 (后面引發(fā)免密問題、切換root用戶問題、自啟終端問題、系統(tǒng)日志加入讀權(quán)限問題,sudo免加載終端問題)。
解決流程:
System.sh:
#!/bin/bash cp -fp /var/log/messages* ./ zip -r -j -p -m -8 System.zip ./messages*
執(zhí)行:
【思路1:權(quán)限問題,加入sudo來處理】
System_root.sh:
#!/bin/bash sudo cp -fp /var/log/messages* ./ sudo zip -r -j -p -m -8 System.zip ./messages*
執(zhí)行:
需要人機交互來輸入密碼,由于腳本是程序帶起,需要跳過輸入密碼的交互階段,需要解決免密問題
設(shè)置用戶部分工具sudo免密功能
切換為root,執(zhí)行vim /etc/sudoers或者visudo,加入行(箭頭處)
執(zhí)行:
成功?。。?/span>
此時,應(yīng)該可以解決問題了。
悲劇的是,程序帶起時仍然沒有看到壓縮包?。。??
【思路2:直接切換root用戶】
換個思路,切換root賬戶來處理
使用spawn expect轉(zhuǎn)換root用戶
需要安裝tcl+expect,安裝光盤中有
安裝:rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm expect-5.44.1.15-5.el6_4.x86_64.rpm
SwitchRoot.exp
#!/usr/bin/expect MyPassword=123456 spawn su root expect "password:" send "${MyPassword}\r" send "./System.sh" interact
System.sh
#!/bin/bash cp -fp /var/log/messages* ./ zip -r -j -p -m -8 System.zip ./messages*
該腳本手動執(zhí)行沒有問題,但是程序帶起時仍然無壓縮包生成。與上個思路最后的結(jié)果相同,不再附帶圖片
【思路3:自啟動終端】
既然手動執(zhí)行可以,程序帶起有問題,難道是程序執(zhí)行環(huán)境有問題?
不多說,手動執(zhí)行MyInfoCollector 后: cat /proc/pid/environ > environ_self
被MyMonitor帶起執(zhí)行MyInfoCollector 后: cat proc/pid/environ > environ_auto
由于東西太多,暫不貼圖了,發(fā)現(xiàn)手動執(zhí)行時有gnome相關(guān)環(huán)境,帶起執(zhí)行時沒有這個gnome環(huán)境,自建一個shell來執(zhí)行腳本?開干!
設(shè)置啟動終端功能
testShell.sh
#!/bin/bash gnome-terminal -e 'bash -c "bash System_root.sh"'
System_root.sh
#!/bin/bash sudo cp -fp /var/log/messages* ./ sudo zip -r -j -p -m -8 System.zip ./messages*
手動執(zhí)行沒問題! 自啟動直接顯示錯誤了,(此處后期加入了錯誤日志輸出,可以看到gnome-terminal執(zhí)行結(jié)果日志為“無法處理參數(shù):無法打開顯示,返回值為1”)
此路不通!
【思路4:無權(quán)限文件加讀權(quán)限】
系統(tǒng)默認情況下的messages*只有root用戶有讀寫權(quán)限,其他用戶沒有讀權(quán)限,需要設(shè)置一下,起初以為只要將/var/log文件夾設(shè)置為可讀即可,然而并不然,其本來就可讀。那就只能設(shè)置具體的日志權(quán)限了。
系統(tǒng)初始文件情況:
設(shè)置文件日志可讀
Root賬戶打開/etc/logrotate.d/syslog:將紅色箭頭部分插入文件:
刪除/var/log/messages*
重啟rsyslog服務(wù):
重啟后可以看到日志支持普通用戶讀取了
結(jié)果可喜,當前需求解決,但是mysqld.log如何處理,如果后期有其他文件也需要怎么處理,顯然該方案只能解決一時之需。不可取。
【思路5:sudo免加載終端問題】
思路4的局限性而不被采用。此時恍然大悟,求助于shell的輸出重定向功能,看看為何不能執(zhí)行,將返回值也查看下。
采用腳本System_root.sh ,內(nèi)部將標準錯誤也一同輸出到界面才發(fā)現(xiàn)問題:
sudo:抱歉,您必須擁有一個終端來執(zhí)行 sudo
原來sudo執(zhí)行時默認需要終端。
設(shè)置普通用戶adz的sudo不使用默認值,在Default requiretty下再加一行Default:用戶名 !requiretty:
目前采用此方案,尚未發(fā)現(xiàn)其他異常情況,如果存在,稍后更新
【思路6:其他思路】
為何mysql用戶將mysqld.log寫入操作系統(tǒng)路徑,是否使用了sudo,它有沒有參考性?
采取思路5是否有其他安全性需要處理,是否是最好的解決方式?
還有其他方式么?shell關(guān)于權(quán)限的處理剛接觸,寫的有些low了,有問題請指正。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。