모드 씨큐리티 로그 분석 / mod security mod_security log analysis


색깔 칠한 부분만 보면된다.


###파란색 글씨###

딱 보면 알겠지만 로그가 쌓일때 로그 ID이다. 

a~f / 0~9  8자리 랜덤 조합 그 뒤에 A, B, F, Z 등은 시간,접근방법, 탐지된 정책등의 정보가 담겨있다. 

SecAuditLogParts "ABIFHZ"  모드시큐리티 설정에 있다.

추가로

SecAuditLogRelevantStatus "^(?:5|4\d[^4])"  설정을 통해 404 등의 쓸때없는 페이지는 로그를 안 쌓을 수 있다.


###빨간색 글씨###

중요한 부분이다. 어떤식으로 접근했을때 탐지되었는지 알 수 있다.


###초록색 글씨###

어떤 정책에서 걸렸는지 알 수 있다. 



자세한건 로그 보면서 적겠지만 요약하자면


1.운영중인 홈페이지인 경우 2~4주정도의 탐지기간을 거쳐 로그를 검토하여 차단모드로 변경
ㄴ이유는 정상적인 접근도 차단 될 수 있기 때문이다. 

ㄴ만약 개발중인 사이트라면 처음부터 차단모드로 해놓고 안되는것들은 소스를 수정 & 정책을 주석하면 된다.


2.로그 분석은

먼저 파랑색 부분에서 동일한 로그끼리 보고 
빨간색 부분 체크하여 정상/비정상 유무 판단, (본인이 못하면 관리자, 개발자, 홈페이지 운영자등이 확인 가능)

정상이라면 초록색 부분에서 정책적용되지 않도록 해당 라인을 주석 / 비정상이라면 걸려서 접근 안된거니까 냅두면되고..





--892b4e44-A--   접근 시간 / 아아피등의 정보

[11/Aug/2017:13:44:57 +0900] WY02SX8AAAEAAAucFrcAAAAa 0.0.0.0 49410 0.0.0.0 443

--892b4e44-B-- 접근 URL 

GET /test/test.html?jb_type=G&ipZe%3D6199%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2C2%2C3%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%20..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1




Host: rsync.net

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Encoding: gzip, deflate, br

Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

Cookie: ACEUCI=1; PHPSESSID=a68fb899645d3c714231582cdd838ede; new_connect=0.0.0.0; ACEFCID=UID-598BEEBEC8E8787061A4F93F; ACEUCI=1; wcs_bt=s_23983

7b585db:1502424521

###Cookie 부분에서 php 세션 아이디 확인 가능### 만약 비정상적인 접근이라면 아이피확인하여 차단시켜도 좋다.


--892b4e44-F--

HTTP/1.1 200 OK    

###이부분 체크해야한다. 404 인지 400인지 혹은 200인지...  404나 403 처럼 파일이 없거나 퍼미션 denied 면 어차피 접근이 안된거라 상관없겠지만 200 이면 접근이 돼기는 했다는 거

X-Powered-By: PHP/5.2.17

Expires: Thu, 19 Nov 1981 08:52:00 GMT

Cache-Control: no-cache, must-revalidate

Pragma: no-cache

P3P: CP="NOI CURa ADMa DEVa TAIa OUR DELa BUS IND PHY ONL UNI COM NAV INT DEM PRE"

Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: POST, GET, OPTIONS

Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version

Keep-Alive: timeout=30, max=1000

Connection: Keep-Alive

Transfer-Encoding: chunked

Content-Type: text/html; charset=utf-8


--892b4e44-H--

Message: Warning. Pattern match "/etc/passwd" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "300"]

##어느 정책에 걸렸는지 확인 가능하다. 위 내용은 /etc/passwd 라는 패턴이 URL에 들어가서 mod_security.conf 파일의 300째 라인의 정책에 탐지됐다는 내용

Message: Warning. Pattern match "\.\./" at REQUEST_URI. [file "/usr/local/apache/conf/mod_security.conf"] [line "306"]

##마찬가지로 URL에 ../ 라는 특문이 포함돼있어 306 라인의 정책에 탐지됐다.


Stopwatch: 1502426697568606 27545 (118 559 -)

Producer: ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/).

Server: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips DAV/2 PHP/5.2.17


--892b4e44-Z--


위 로그를 정리하자면


http://naver.com/../../../etc/passwd 로 접속했기 때문에 ../ 와 /etc/passwd 두가지 정책에 걸려서 로그가 쌓인거다. 
보통 도메인 홈디렉토리는 /home/계스트명/www 처럼 어느정도 유추가 되기 때문에(실제 절대 경로도 확인 할 수 있음) 위와같이 http://naver.com/../../../etc/passwd 도메인을 접속하게 되면 서버에서는

/home/계스트명/www/../../../etc/passwd 파일을 확인 할 수 있다.





######################

#!/bin/sh


err_num1=`grep "HTTP/1.1 404 Not Found" 2017.log_line | awk '{print $1}'`



for i in $err_num1;

do


err_num=`expr $i - 1`


sed -n  $err_num'p' 2017.log >> err_name1.txt

done


ERR=`cat err_name.txt`


for i in $ERR; do


echo $i


ERR_Z=`echo -ne "--"$i"-Z--"`

ERR_A=`echo -ne "--"$i"-A--"`



echo $ERR_Z 

echo $ERR_A



sed -i "/$ERR_A/,/$ERR_Z/d" 2017.log



done

#########


위 스크립트는 불피요한 로그들 삭제하는거 

404 나 낫 파운드는 어차피 파일이 없는거기 때문에 정상적인 접근일 수 가 없다.




사실 모드시큐리티 로그는 비정상적인 접근을 확인하고 해당 아이피를 차단하는것도 있겠지만

그것보다는 정상적인 접근을 확인해서 서비스중인 홈페이지에 장애가 되지 않도록 설정하는데 더 의미가 있다고 봄

'job > apache' 카테고리의 다른 글

apache 오래된 버전 이전  (0) 2018.09.03
아파치 모듈 설명  (0) 2018.09.03
apache module forensic log 설정  (0) 2018.08.31
mod_xsendfile 설치 하기  (0) 2018.08.31
아파치 로그에 PID 쌓기  (0) 2018.08.31

mod_xsendfile 설치하기


wget https://tn123.org/mod_xsendfile/mod_xsendfile-0.12.tar.gz


다운받고


압축풀고


들어가서 apxs -cia xsendfile파일이름 하면 알아서 다 됨


그리고 아파치 재시작하고 


apachectl -M 해서 잘 올라왔나 확인

+ sed -i /--fa642a31-A--/,/--fa642a31-Z--/d 2017.log




+ sed -i /삭제할 문장 시작/,/삭제할 문장 끝/d 파일명

perl -e 'open A,$ARGV[0]; open B,$ARGV[1]; @h{<A>}++; print grep {!exists $h{$_}} <B>' test input






ex)

cat test1.txt

aaa

bbb

ccc




cat test2.txt

aaa

ccc



perl -e 'open A,$ARGV[0]; open B,$ARGV[1]; @h{<A>}++; print grep {!exists $h{$_}} <B>' test2.txt test1.txt   


bbb

출처 http://mwultong.blogspot.com/2006/11/vim-vi-select-copy-paste.html


vi 복사




리눅스/유닉스의 빔(vim/vi) 에디터에서는


v, y, p

3개의 키로, 텍스트를 복사하여 다른 곳에 붙이는 작업을 할 수 있습니다.


 


텍스트 복사 붙이기 순서


(1) v : Visual mode 로 진입 (현재 문서를 편집중이라면 Esc키를 누르고, v키를 눌러야 함)


(2) 그런 후, 상하좌우 화살표키를 움직이면, 이제 선택 블록이 회색으로 잡힙니다. 복사할 부분을 선택합니다.


(3) y : yank (복사; Copy) yank는 '홱 잡아당긴다'는 뜻


(4) 문서를 스크롤하여, 복사된 텍스트를 붙어 넣을 곳으로 이동


(5) p : put (붙여 넣기; Paste)



이제 텍스트가 카피/붙이기 되었을 것입니다.


블록을 선택하다가 취소하고 싶을 경우에는, Esc키 또는 Ctrl+c 키를 누르면 됩니다.



 


컬럼 블록 (박스 블록) 선택하는 법


v키 대신에, Ctrl+v키를 누르면, 사각형 형태로 블록이 선택됩니다.


다만, 윈도우(Win32) 버전의 Gvim에서는, Ctrl+q 키를 눌러야 할 것입니다.



 


줄단위로 선택하기


소문자 v가 아닌, 대문자 V를 누르면, 줄단위로 선택됩니다. (소문자 v는 글자 단위로 선택됨)



 


선택 영역의 텍스트 지우기/삭제


선택된 텍스트를 지우려면, 블록이 선택된 상태에서 d 키를 누릅니다.

'job > linux' 카테고리의 다른 글

centos 6 xtables 설치시 에러  (0) 2018.08.31
nginx-php 연동 php-fpm fpm nginx php 연동  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31

퍼옴 : xinet.kr


apache 2.4 버전에 php 5.2 x 설치를 하고 나서 httpd -t 를 하게 되면

libphp5.so: undefined symbol: unixd_config 에러가 발생된다


이것은 apache 버전업으로 인해서 심볼 명칭이 변경되었기 때문이다

그럼 이것을 해결하는 방법은 알아보자


방법은 간다하다 php 컴파일 진행하기전에 파일을 수정후에 진행하면 된다


먼저 php 압축된 폴더가 있다면 php_functiuons.c 파일을 열어서 386번 라인과 417번 라인에서 unix_config 부분을

ap_unix_config 라고 수정하면 된다.


[root@localhost php-5.2.17]# vi sapi/apache2handler/php_functions.c


386         AP_DECLARE_DATA extern unixd_config_rec unixd_config;

수정

386         AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config;


417         snprintf(tmp, sizeof(tmp), “%s(%d)/%d”, unixd_config.user_name, unixd_config.user_id, unixd_config.group_id);

수정

417         snprintf(tmp, sizeof(tmp), “%s(%d)/%d”, ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id);


위에 라인에서 총 4군데를 수정해주면 된다.


그리고 나서 php 컴파일 진행

'job > linux' 카테고리의 다른 글

nginx-php 연동 php-fpm fpm nginx php 연동  (0) 2018.08.31
vi 명령어 옵션  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31
dell / hp 서버 서비스 태그 확인하기  (0) 2018.08.31

mysql 처음 컴파일할때 아래 옵션 추가

-DWITH_INNODB_MEMCACHED=ON


###위 옵션 안해주면 플러그인에 innodb_memcached 설치 안됨






그다음 설치 다 하고




 # mysql -u root -p < /opt/mysql/share/innodb_memcached_config.sql


 # mysql -u root -p


mysql> install plugin daemon_memcached soname "libmemcached.so";








다하고 mysql 재시작하면 아래와같이 mysql 로 11211 포트 올라온거 확인됨




tcp        0      0 :::11211                    :::*                        LISTEN      7093/mysqld       


https://docs.google.com/document/d/1WE1V4uczxavqLY-nyr3qNqCxqzoOf8Vg6Z-Lf0c3DwU/edit#heading=h.4805uy5ihmx


유용한것도 있고... 첨보는것도 있고... 


mysql> set global log_slow_queries = ON;              


ERROR 1238 (HY000): Variable 'log_slow_queries' is a read only variable





####공식홈페이지 설명#######

One way around this is to setup the machine with the Slow Query Log 

enabled but to use a very large value of --long-query-time to 

essentially ignore every query. Then, when you want to capture slow 

queries, you reset --long-query-time to a reasonable value. 

Unfortunately, this requires a restart to initialize. After that you can 

adjust the --long-query-time to throttle the contents of the log.





mysql5.0 버전까지는 재시작없이는 설정이 안된단다. my.cnf에 등록하고 db 재시작해야한다. 5.1부터는 재시작없이 설정가능

리눅스용 실시간 모니터링 툴 netdata 간단 설치


# yum install -y zlib-devel gcc make git autoconf autogen automake pkgconfig


# git clone https://github.com/firehol/netdata.git –depth=1


# cd netdata


# ./netdata-installer.sh


설정파일은 /etc/netdata/netdata.conf


19999 포트오픈되고 웹페이지에서 확인가능

'job > open source' 카테고리의 다른 글

ansible 설명  (0) 2018.09.21
zimbra 오픈소스 웹메일 짐브라  (0) 2018.09.03

톰캣(java) 아웃오브메모리(java.lang.OutOfMemoryError: GC overhead limit exceeded)


해결 방법




대충 처리하자면 현재 사용중인 메모리중 여유 메모리 어느정도인지 확인해서 더 추가해주기


ㄴ그전에 프로그램상의 메모리 누수는 없는지 확인해야함, 이거는 개발단








 ps -ef | grep java 해서 Xmx 설정이 없으면 자바에 디폴트로 설정된 값으로 할당된 상태이니 아래 명령어를 통해 확인 가능


##아래는 java의 디폴트 사이즈 확인하는명령어 보통 heap사이즈는 실제 물리 메모리의 4분의1 이 할당되는듯


[root@localhost]# java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'


     intx CompilerThreadStackSize                   = 0                                   {pd product}


    uintx ErgoHeapSizeLimit                         = 0                                   {product}


    uintx HeapSizePerGCThread                       = 87241520                            {product}


    uintx InitialHeapSize                          := 257949696                           {product}


    uintx LargePageHeapSizeThreshold                = 134217728                           {product}


    uintx MaxHeapSize                              := 4116709376                          {product}


     intx ThreadStackSize                           = 1024                                {pd product}


     intx VMThreadStackSize                         = 1024                                {pd product}


####




####현재 java 메모리 어느 영역 사용중인지 찍는 로그


java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC -Xloggc:/root/test.txt


ㄴ값이 항상 일정한것이.... 뭔가 찾아보면 있을꺼같은데 잘 모르겄다..이건 어디에 쓰이는지 더 확인해봐야함


####




카타리나.sh 에 추가 JAVA_OPTS="$JAVA_OPTS -Xms8192M -Xmx8192M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tomcat_oom_dump.txt"




근데 메모리 늘려줘도 oom 발생하면 덤프파일을 통해 분석을 해보자


카타리나.sh에 추가한 JAVA_OPTS 중 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tomcat_oom_dump.txt" 이부분이 oom 에러 발생할경우 덤프파일 생성하는거






덤프파일 pc로 옮기고 아래에서 분석툴 다운받기


http://www.eclipse.org/downloads/download.php?file=/mat/1.7/rcp/MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip&mirror_id=1255






오픈 heap 파일 할때 java heap space 에러나면 덤프파일 분석시 사용되는 메모리가 부족해서 발생하는거다.


압축 푼 파일보면 memory analyzer.ini 파일 있는데 거기서 Xmx 값을 2048 혹은 4096으로 늘려준다.


8기가짜리 하는데 8000 주니까 된다. 그럼 pc 메모리가 부족하면 애초에 돌리질 못하냐 ? 아니다. 뭐 하는방법이 있다. 구글링해보면.

'job > was' 카테고리의 다른 글

tomcat ssl 인증서 설치  (0) 2018.08.31

고객 문의중 기존서버에서는 잘되던 sns 내보내기 기능이 새로 구입한 서버에서는 정상적으로 안된다고한다.


http://도메인/bbs/sns_send.php?longurl=http%3A%2F%2F도메인%2Fshop&title=sns=gplus




위와같은 주소로 연결이 되는데 서버로는 연결이 되는듯 하나 아파치 로그에는 찍히지 않는것으로 보아 아파치 문제는 아닌듯 하다.




bbs/sns_send.php 를 살펴보면




  5 $title    =  urlencode(str_replace('\"', '"',$_REQUEST['title']));


  6 $short_url = googl_short_url($_REQUEST['longurl']);


  7 if(!$short_url) {


  8         $short_url = $_REQUEST['longurl'];




위 내용중 6번 라인을 주석하면 정상적으로 작동된다는 글을 구글링을 통해 찾았다. 




실제로 6번 라인 주석하니 sns 내보내기 기능이 정상적으로 작동된다.




그럼 googl_short_url 이라는 함수가 정상적으로 작동되지 않는다는건데...




googl_short_url 이라는 함수 설정은 lib/common.lib.php 파일에 들어가 있다.




2761 // goo.gl 짧은 주소 만들기


2762 function googl_short_url($longUrl)


2763 {


2764     global $config;


2765 


2766     // Get API key from : http://code.google.com/apis/console/


2767     // URL Shortener API ON


2768     $apiKey = $config['cf_googl_shorturl_apikey'];


2769 


2770     $postData = array('longUrl' => $longUrl);




위와같이 




google.com 에서 API 키를 받아와야 한다.




도메인/adm 들어가서 환경설정의 SNS 쪽 확인해보면 구글 짧은주소 API KEY 등록하는부분이 있긴 하지만... 애초에 짧은 주소 기능을 사용 안하게 되면 위 함수와 현재 정상적으로 작동되지 않는 sns 내보기 기능과는 무관한듯 보인다...




결론은 구글링에서 찾은 6번라인 주석하면 해결된다는것은 임시방편(다른쪽에 에러가 있을 수도 있음)에 불과하다...




계속 테스트 해보니




https 로 넘어갈 때 정상적으로 작동을 하지 않는다.




소스 보면 curl 을 통해서 http 혹은 https 로 넘어가는데 .. 확인결과 구서버에는 curl 에 openssl 이 enable 돼 있으나 신 서버는 openssl 의 없다(cURL Information => libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2) 






########curl 재설치#######


상황


cent 5사용중이던 고객사가 cent 6 로 서버 이전




이전중 문제 발생, 원인은 curl 에 openssl 이 적용돼있지 않음




이번주에 위와 똑같은 문제인 고객사 1명 더 있었음


(이사람도 구서버는 잘돼는데 이번에 신서버(구서버 신서버 os 기억안남)


에서는 특정 기능이 안된다는 문의였음)






궁금한점


구서버와 신서버의 curl 달라진건가 ?


아니면  cent 5점대 6점대 버전차이 ?






curl 에 open ssl 기능이 포함돼 있찌 않으면 그 결제모듈? 이런거 통신할때


curl 에 openssl 기능 사용해야되서 문제 있을듯합니다. 




해결은




curl 다운받고 설치 


tar xvfz curl-7.49.0.tar.gz 


cd curl-7.49.0


./configure --prefix=/usr/local/curl


make && make install




기존 curl 백업


cd /usr/lib64


mkdir curl_backup


mv libcurl.so* curl_backup/


cp -a /usr/local/curl/lib/libcurl.* ./




아파치 재시작하면 curl 에 openssl 포함돼있음




##############




위와같이 curl 재설치 하면 


cURL Information => libcurl/7.49.0 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18openssl 들어가있음


##############


위 문제가 아니였다. 개삽질 했다.

localhost로 통신을 해야하는데 iptables로 제일 상단에 해외아이피 차단(!KR 제외한 모든 아이피 차단)을 걸어놨다. 그러면서 127.0.0.1 즉 로컬호스트도 차단이 된거다. 그래서 안됐던거임

iptables -A INPUT -m geoip  ! --source-country KR -j LOG --log-prefix "Input DROP : "




해당 정책으로 인해 차단되는 아이피들을 /var/log/messages 에서 확인할 수 있다.




iptables로 인해 차단되는 패킷을 메세지로그에 찍는거

'job > linux' 카테고리의 다른 글

vi 명령어 옵션  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31
dell / hp 서버 서비스 태그 확인하기  (0) 2018.08.31
sed 및 awk 사용법  (0) 2018.08.31

웹에다 파일 업로드해서 간단하게 바이러스 검사하는 웹 페이지




https://www.virustotal.com/#/home/upload


-b

I/O및 전송 속도 통계를 보고합니다. 다음 값이 표시됩니다.



tps

물리적 장치에 실행된 초당 총 전송 수입니다. 전송은 물리적 디바이스에 대한 I/O요청입니다. 다중 논리적 요청을 디바이스에 대한 단일 I/O요청으로 결합할 수 있습니다. 전송이 중간 크기입니다.


rtps

물리적 디바이스에 대해 실행된 초당 읽기 요청의 총 수입니다.


wtps

물리적 장치에 대해 실행된 초당 총 쓰기 요청 수입니다.


bread/s

초당 블록 단위로 디바이스에서 읽은 총 데이터 양입니다. 블록은 2.4커널 이상의 섹터와 동등하기 때문에 512바이트의 크기를 갖습니다. 이전 커널의 경우 블록의 크기가 불명확하다.


bwrtn/s

초당 블록으로 디바이스에 기록된 총 데이터 양입니다.

-B 

호출 통계를 보고합니다. 아래의 일부 메트릭은 포스트 2.5커널에서만 사용할 수 있습니다. 다음 값이 표시됩니다.




pgpgin/s

시스템이 디스크에서 초당 페이징 된 총 킬로바이트 수입니다. 참고:이전 커널(2.2. x)의 경우 이 값은 킬로바이트가 아닌 초당 블록 수입니다.



pgpgout/s

시스템이 초당 디스크로 경로 지정된 총 킬로바이트 수입니다. 참고:이전 커널(2.2. x)의 경우 이 값은 킬로바이트가 아닌 초당 블록 수입니다.


fault/s

초당 시스템에서 발생한 페이지 장애 수입니다. 일부 페이지 장애는 I/O없이 해결될 수 있기 때문에 I/O를 생성하는 페이지 장애의 수입니다.


majflt/s

디스크에서 메모리 페이지를 로드해야 하는 경우의 초당 시스템에 발생한 주요 결함 수입니다.


pgfree/s

초당 시스템에서 사용 가능한 목록에 배치한 페이지 수입니다.


pgscank/s

1초에 SCE대몬이 검색한 페이지 수.


pgscand/s

초당 직접 스캔한 페이지 수입니다.


pgsteal/s

메모리 요구를 충족하기 위해 시스템이 초당 캐시(페이지 캐시 및 스왑 캐시)에서 재확보한 페이지 수입니다.



%vmeff

pgsteal / pgscan으로 계산되는 이것은 페이지 회수 효율성의 지표입니다. 만일 이것이 거의 100%에 가까우면, 비활성 목록의 뒤에 나오는 거의 모든 페이지가 거두어 질 것이다. 메모리가 너무 낮으면(예:30%미만)가상 메모리에 약간의 문제가 있는 것입니다. 이 필드는 간격 동안 검색된 페이지가 없는 경우 0으로 표시됩니다.






델 서버  

omreport chassis info | grep 'Chassis Service Tag'



HP 서버
hpasmcli -s "show server"


출처 : http://ai.korea.ac.kr/~kaizer/unix/scripts.htm


sed [-e script][-f script-file][file...]


기본적인 기능은 ed에서 따 왔으며, 이 기능들은 모두 sed에 적용이 된다. 다만 ed는 대화형 편집기이며,

sed는 스트리밍 편집기이다. 대화형 편집기와 스트리밍 편집기의 차이점은 대화형 편집기는 입력 및 출력이

하나로 이루어지며, 스 트리밍 편집기는 하나의 입력이 하나의 출력을 낸다는 것이다.

\n 을 개행문자로 사용하는 스트리밍 에디터이다. 


찾기(search), 출력(print),

sed -n '/abd/p' list.txt : list.txt 파일을 한줄씩 읽으면서(-n : 읽은 것을 출력하지 않음) abd 문자를 찾으면 그 줄을 출력(p)한다.


치환(substitute),

sed 's/addrass/address/' list.txt : addrass를 address로 바꾼다. 단, 원본파일을 바꾸지 않고 출력을 바꿔서 한다.

sed 's/addrass/address/' list.txt > list2.txt

sed 's/\t/\ /' list.txt : 탭문자를 엔터로 변환

sed 's/□□*/□/' list.txt : ( *표시: □ 는 공백 문자를 표시한다. ) 위의 구문은 한개이상의 공백문자열을 하나의 공백으로 바꾼다.


추가(insert)

scriptfile - s/

삭제(delete)

sed '/TD/d' 1.html : TD 문자가 포함된 줄을 삭제하여 출력한다.

sed '/Src/!d' 1.html : Src 문자가 있는 줄만 지우지 않는다.

sed '1,2d' 1.html : 처음 1줄, 2줄을 지운다.

sed '/^$/d 1.html : 공백라인을 삭제하는 명령이다

파 일 이름만을 뽑아내는 정규식

s/^.*\/\([a-zA-Z0-9.]*\)".*$/\1/ : ^는 라인의 맨 처음, .* 아무문자열, \(, \)은 정규표현식을 그룹화, $ 는 라인의 맨 끝.

( s;^.*\/\([a-zA-Z0-9.]*\)".*$;\1;) \1는 그룹화된 첫번째 요소를 말한다.

[a-zA-Z0-9.] 는 알파벳과 숫자 및 .(콤마)를 표현하는 문자(character)를 말한다.

즉 GF02.jpg와 같은 문자열을 첫번째 그룹화하고 난 다음 라인 전체를 그룹화된 내용으로 바꾸는 것이다. 


/g : global을 의미 한줄에 대상문자가 여러개일 때도 처리하도록 한다.


who | sed -e 's; .*$;;' : 각 라인의 첫 번째 공백에서부터 마지막까지 삭제하라.


who | sed -e 's;^.* ;;' : 각 라인의 처음부터 맨 마지막 공백까지 삭제하라.


who | sed -e 's;^.*:;;' : 각 라인의 처음부터 : 문자가 있는 곳(:문자포함)까지 삭제하라. 


-n 옵션

sed는 항상 표준 출력에서 입력 받은 각 라인을 나타낸다는 것을 알아냈다. 그러나 때때로 한 파일로부터 몇 개의 라인들을 추출해 내기 위해 sed를 사용하기를 원할 때도 있다. 이러한 경우에 -n옵션을 사용한다. 이 옵션은 사용자가 만약 해야 할 일을 정확히 말해 주지 않는다면 임의의 라인을 프린트하는 것을 원하지 않는다고 sed에게 말한다. 따라서 p명령이 같이 쓰인다. 라인 번호와 라인 번호의 범위를 나타냄으로써 sed를 사용하여 텍스트의 라인들을 선택적으로 프린트할 수 있게 한다. 다음에서 볼 수 있는 바와 같이, 한 파일로부터 첫 번째 두 라인이 프린트되었다.


$ sed -n '1,2p' intro Just print the first 2 lines from intro file.


만약 라인 번호 대신에 슬래시로 에워 싸인 문자열과 함께 p명령이 쓰인다면 sed는 이들 문자들이 포함하고 있는 표준 입력을 통해서 라인들을 프린트하게 된다. 따라서 하나의 파일로부터 처음의 두 라인을 프린트하기 위하여 다음과 같이 사용될 수 있다.


$ sed -n '/UNIX/p' intro Just print lines containing UNIX

sed '5d' : 라인 5를 삭제

sed '/[Tt]est/d' : Test 또는 test를 포함하는 모든 라인들을 삭제

sed -n '20,25p' text : text로부터 20에서 25까지의 라인들만 프린트

sed '1,10s/unix/UNIX/g' intro : intro의 처음 10개의 라인들의 unix를 UNIX로 변경

sed '/jan/s/-1/-5' : jan을 포함하는 모든 라인들 위의 첫 번째 -1을 -5로 변경

sed 's/...//' data : 각 data라인으로부터 처음 세 개의 문자들을 삭제

sed 's/...$//' data : 각 데이터 라인으로부터 마지막 3문자들을 삭제

sed -n '1' text : 비 프린트 문자들을 \nn으로 (여기서 nn은 그 문자의 8진수 값임),

그 리고 탭 문자들을 > 로 나타내는 각 텍스트로부터의 모든 라인들을 프린트


awk 명령어


awk '/west/' datafile : west 라는 글이 있는 줄 출력

awk '/^north/' datafile : north로 시작하는 줄 출력

awk '/^(no | so)/' datafile : no 또는 so 로 시작하는 줄 출력

awk '{ print $3, $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 스페이스로 띄어서 출력

awk '{ print $3 $2 }' datafile : datafile 리스트의 세 번째 와 두 번째 필드를 그냥 붙여서 출력 

awk '{ print "Number of fields : " NF} ' datafile : datafile의 각 줄마다의 필드수를 리턴한다.

awk '$5 ~ /\.[7-9]+/' datafile : 다섯 번째 필드가 마침표 다음엣 7과 9사이 숫자가 하나 이상 나오는 레코드 출력

awk '$2 !~ /E/ { print $1, $2 }' datafile : 두 번째 필드에 E 패턴이 없는 레코드의 첫 번째와 두 번째 필드 출력

awk '$3 ~ /^Joel/{ print $3 " is a nice guy."} ' datafile : 세 번째 필드가 Joel로 시작하면 " is a nice guy"와 함께 출력

awk '$8 ~ /[0-9][0-9]$/ { print $8 }' datafile : 여덟 번째 필드가 두 개의 숫자이면 그 필드가 출력

awk '$4 ~ /Chin$/ { print "The price is $" $8 "." }' datafile : 네 번째 필드가 Chine으로 끝나면 "The price is $" 8번 필드 및 마침표가 출력

awk -F: '{ print $1 } ' datafile : -F 옵션은 입력 필드를 ':'로 구별.

awk -F"[ :]" '{ print $1, $2 } ' datafile : 입력 필드로 스페이스와 ':'를 필드 구별자로 사용

awk -f awk_script.file datafile : -f 옵션은 awk 스크립트 파일 사용할 때 씀.



awk '$7 == 5' datafile : 7번 필드가 5와 같다면 출력

awk '$2 == "CT" { print $1, $2 }' datafile : 2번 필드가 "CT" 문자와 같으면 1, 2 번 필드 출력

awk '$7 < 5 { print $4, $7}' datafile : 7번 필드가 5보다 작다면 4번, 7번 필드 출력

awk '$6 > .9 { print $1, $6}' datafile : 6번 필드가 .9 보다 크다면 1번, 6번 출력

awk '$8 > 10 && $8 < 17 ' datafile 

awk '$2 == "NW" || $1 ~ /south/ { print $1, $2 }' datafile 

mariadb-10.2.14 / PHP 7.0.16 설치시 아래와 같이 mysqli 에러 발생
make: *** [ext/mysqli/mysqli_prop.lo] Error 1
make: *** [ext/mysqli/mysqli_api.lo] Error 1
In file included from /root/src/php-7.0.16/ext/mysqli/php_mysqli_structs.h:63,
from /root/src/php-7.0.16/ext/mysqli/mysqli_fe.c:32:
/opt/mysql/include/mysql/my_global.h:3:2: warning: #warning This file should not be included by clients, include only <mysql.h>
In file included from /root/src/php-7.0.16/ext/mysqli/php_mysqli_structs.h:79,
from /root/src/php-7.0.16/ext/mysqli/mysqli_fe.c:32:
/opt/mysql/include/mysql/my_sys.h:3:2: warning: #warning This file should not be included by clients, include only <mysql.h>
In file included from /root/src/php-7.0.16/ext/mysqli/mysqli_fe.c:32:
/root/src/php-7.0.16/ext/mysqli/php_mysqli_structs.h:82:21: error: my_list.h: No such file or directory
/root/src/php-7.0.16/ext/mysqli/php_mysqli_structs.h:83:22: error: m_string.h: No such file or directory
/root/src/php-7.0.16/ext/mysqli/php_mysqli_structs.h:86:21: error: m_ctype.h: No such file or directory

보통 이런경우 구글에다가 검색해보면 

phpbug 사이트에 나오는 경우가 종종 있다.

https://bugs.php.net/patch-display.php?bug_id=75612&patch=mysql-mariadb-10.3.patch&revision=latest

나온대로 소스 수정해서 설치하면 됨


ex)해결책은 아래와 같이 소스 수정하라고 나와있음 그중에서diff -up php-7.2.4/ext/mysqli/mysqli_api.c.omv~ php-7.2.4/ext/mysqli/mysqli_api.c
ㄴ여기 보면 수정해야할 소스 경로 나오죠 ? vi로 php-7.2.4/ext/mysqli/mysqli_api.c 들어가서
--- php-7.2.4/ext/mysqli/mysqli_api.c.omv~ 2018-04-06 21:50:05.183703414 +0200
+++ php-7.2.4/ext/mysqli/mysqli_api.c 2018-04-06 21:50:16.436829372 +0200
@@ -616,7 +616,7 @@ PHP_FUNCTION(mysqli_change_user)
ㄴ616 라인에 보면
  size_t   user_len, password_len, dbname_len;
  zend_ulong  rc;
 #if !defined(MYSQLI_USE_MYSQLND) && defined(HAVE_MYSQLI_SET_CHARSET)
- const  CHARSET_INFO * old_charset;
+ const  MY_CHARSET_INFO * old_charset;
ㄴ위의 내용이 있습니다. 저기서 - 부분은 삭제(혹은 주석) 하고 + 부분은 추가, 즉 CAHRSET_INFO 를 MY_CHARSET_INFO 로변경
 #endif
 
  if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Osss!", &mysql_link, mysqli_link_class_entry, &user, &user_len, &password, &password_len, &dbname, &dbname_len) == FAILURE) {
diff -up php-7.2.4/ext/mysqli/mysqli.c.omv~ php-7.2.4/ext/mysqli/mysqli.c
ㄴ위에서 한것처럼 똑같이 vi 로 php-7.2.4/ext/mysqli/mysqli.c 열고
--- php-7.2.4/ext/mysqli/mysqli.c.omv~ 2018-04-06 21:49:41.782434506 +0200 +++ php-7.2.4/ext/mysqli/mysqli.c 2018-04-06 21:49:52.708561249 +0200 @@ -26,6 +26,7 @@ ㄴ26번 라인보면 #include <signal.h> +#include <server/mysql_version.h> ㄴ여기는 따로 삭제할필요없이 위 내용만 추가하면 되겠죠 ? 이런식으로 어느 파일을 열어서 어느 라인에 추가 삭제 혹은 수정한다음 컴파일 하면 됩니다. #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" diff -up php-7.2.4/ext/mysqli/mysqli_nonapi.c.omv~ php-7.2.4/ext/mysqli/mysqli_nonapi.c --- php-7.2.4/ext/mysqli/mysqli_nonapi.c.omv~ 2018-04-06 21:51:43.217399945 +0200 +++ php-7.2.4/ext/mysqli/mysqli_nonapi.c 2018-04-06 21:58:52.799445824 +0200 @@ -263,7 +263,7 @@ void mysqli_common_connect(INTERNAL_FUNC php_mysqli_set_error(mysql_errno(mysql->mysql), (char *) mysql_error(mysql->mysql)); #if !defined(MYSQLI_USE_MYSQLND) - mysql->mysql->reconnect = MyG(reconnect); +/* mysql->mysql->reconnect = MyG(reconnect); */ #endif mysql_options(mysql->mysql, MYSQL_OPT_LOCAL_INFILE, (char *)&MyG(allow_local_infile)); diff -up php-7.2.4/ext/mysqli/mysqli_prop.c.omv~ php-7.2.4/ext/mysqli/mysqli_prop.c --- php-7.2.4/ext/mysqli/mysqli_prop.c.omv~ 2018-04-06 21:50:25.687842714 +0200 +++ php-7.2.4/ext/mysqli/mysqli_prop.c 2018-04-06 21:50:35.116768902 +0200 @@ -23,6 +23,7 @@ #include <signal.h> +#include <server/mysql_version.h> #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" diff -up php-7.2.4/ext/mysqli/php_mysqli_structs.h.omv~ php-7.2.4/ext/mysqli/php_mysqli_structs.h --- php-7.2.4/ext/mysqli/php_mysqli_structs.h.omv~ 2018-04-06 21:49:12.161080045 +0200 +++ php-7.2.4/ext/mysqli/php_mysqli_structs.h 2018-04-06 21:58:44.599503172 +0200 @@ -79,11 +79,7 @@ #include <my_sys.h> #include <mysql.h> #include <errmsg.h> -#include <my_list.h> -#include <m_string.h> #include <mysqld_error.h> -#include <my_list.h> -#include <m_ctype.h> #include "mysqli_libmysql.h" #endif /* MYSQLI_USE_MYSQLND */ @@ -326,7 +322,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqli) char *default_user; char *default_socket; char *default_pw; - zend_long reconnect; +/* zend_long reconnect; */ zend_long allow_local_infile; zend_long strict; zend_long error_no;




참고로 위 에러는 centos 7 에 php 7.2 - mariadb 10.3 설치시 php 컴파일할 ㄸ ㅐ에러 난다.

이거 작성할때는 위와같이 소스파일 수정하면 잘 됐었는데 오늘(2019-05-28) 해보니까 또 다른 에러가 난다.

In file included from /root/src/php-7.2.18/Zend/zend.h:29:0,

                 from /root/src/php-7.2.18/main/php.h:35,

                 from /root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:25:

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c: In function ‘driver_reconnect_read’:

/root/src/php-7.2.18/Zend/zend_API.h:183:76: error: ‘zend_mysqli_globals’ has no member named ‘reconnect’

 #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v)

                                                                            ^

/root/src/php-7.2.18/Zend/zend_types.h:671:5: note: in definition of macro ‘ZVAL_BOOL’

    (b) ? IS_TRUE : IS_FALSE; \

     ^

/root/src/php-7.2.18/ext/mysqli/php_mysqli_structs.h:337:16: note: in expansion of macro ‘ZEND_MODULE_GLOBALS_ACCESSOR’

 #define MyG(v) ZEND_MODULE_GLOBALS_ACCESSOR(mysqli, v)

                ^

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:35:20: note: in expansion of macro ‘MyG’

  ZVAL_BOOL(retval, MyG(value)); \

                    ^

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:120:1: note: in expansion of macro ‘MAP_PROPERTY_MYG_BOOL_READ’

 MAP_PROPERTY_MYG_BOOL_READ(driver_reconnect_read, reconnect)

 ^

In file included from /root/src/php-7.2.18/main/php.h:39:0,

                 from /root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:25:

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c: In function ‘driver_reconnect_write’:

/root/src/php-7.2.18/Zend/zend_API.h:183:76: error: ‘zend_mysqli_globals’ has no member named ‘reconnect’

 #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v)

                                                                            ^

/root/src/php-7.2.18/ext/mysqli/php_mysqli_structs.h:337:16: note: in expansion of macro ‘ZEND_MODULE_GLOBALS_ACCESSOR’

 #define MyG(v) ZEND_MODULE_GLOBALS_ACCESSOR(mysqli, v)

                ^

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:42:2: note: in expansion of macro ‘MyG’

  MyG(value) = Z_LVAL_P(value) > 0; \

  ^

/root/src/php-7.2.18/ext/mysqli/mysqli_driver.c:121:1: note: in expansion of macro ‘MAP_PROPERTY_MYG_BOOL_WRITE’

 MAP_PROPERTY_MYG_BOOL_WRITE(driver_reconnect_write, reconnect)

 ^

make: *** [ext/mysqli/mysqli_driver.lo] Error 1


요런 에러 난다.


이거 해결 방법이 소스 파일 수정하지말고 
--with-mysqli=/opt/mysql/bin/mysql_config --with-pdo-mysql=/opt/mysql
처음 컴파일 옵션 위와같이 줫는데
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-mysql-sock=/tmp/mysql.sock

위와같이 바꿨다. 잘된다.


php 7 이상부터는 mysqli=path(경로)로 주지 말고 mysqlnd로 줘야 한다.

rpm -qf /usr/bin/ssh

openssh-clients-5.3p1-123.el6_9.x86_64

해당파일이 어느패키지에 들어가있는지



rpm -ql openssh-clients-5.3p1-123.el6_9.x86_64

/etc/ssh/ssh_config

/usr/bin/.ssh.hmac

/usr/bin/scp

해당 패키지에 어느파일이 들어있는지

'job > linux' 카테고리의 다른 글

libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
iptables 차단 정책 로그 쌓기  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31
dell / hp 서버 서비스 태그 확인하기  (0) 2018.08.31
sed 및 awk 사용법  (0) 2018.08.31

LogFormat "%h %l %u %T %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %P" combined


+ Recent posts