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