기초 Linux 서버관리2014. 5. 13. 16:28

shc로 바이너리한 파일 crontab에서 실행 안 될때.


shc는 파일 내용을 공개하기가 껄끄러울 때, 파일 안의 내용을 바이너리로 변경해 주는 명령어이다.


설치 및 사용 방법은 아래 링크를 참고 하시기 바랍니다.


http://www.thegeekstuff.com/2012/05/encrypt-bash-shell-script/


shc 설치 방법은 구글에서 찾아 보면 많이 있기 때문에 따로 기재하지 않았다.


shc 설치 완료하면 shc -f 파일명 입력하면 아주 간단하게 바이너리 파일이 생성이 된다.


그러나, 문제는 crontab에 넣어서 자동으로 실행하게 되면 cron로그에는 실행되었다고 찍히지만,


ps aux 프로세스 상태들을 보면 무수히 많은 좀비 프로세스가 존재할 것이다.


왜 이런 현상이 일어나는지 간단하게 확인해 보겠다.


# strace sh -c ./test.pl

<...중략...>

mprotect(0x3b6db8a000, 16384, PROT_READ) = 0
mprotect(0x3b6d21f000, 4096, PROT_READ) = 0
munmap(0x7ff4eb76e000, 43170)           = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff4eb76c9d0) = 10241
wait4(10241, ./test.pl.x: Operation not permitted
 <unfinished ...>
+++ killed by SIGKILL +++
Killed

#


마지막에 핵심 문구가 떡하니 보인다.

"Operation not permitted"


"Operation not permitted" 문구는 속성 제한이 있을 때,보여지는 문구인데 파일 속성에 문제가 있나? 한번 살펴 보자


# lsattr ./test.pl
-------------e- ./test.pl


속성 걸린 것이 없다.(e는 ext4를 나타내는 것이니 무시하자. 필자의 OS는 centos 6.5이고 ext4환경이다.)


그럼 바이너리 변경이 될 때, 문제가 있다는 건데 shc 옵션을 한번 볼까.


    -e %s  Expiration date in dd/mm/yyyy format [none]
    -m %s  Message to display upon expiration ["Please contact your provider"]
    -f %s  File name of the script to compile
    -i %s  Inline option for the shell interpreter i.e: -e
    -x %s  eXec command, as a printf format i.e: exec('%s',@ARGV);
    -l %s  Last shell option i.e: --
    -r     Relax security. Make a redistributable binary
    -v     Verbose compilation
    -D     Switch ON debug exec calls [OFF]
    -T     Allow binary to be traceable [no]
    -C     Display license and exit
    -A     Display abstract and exit
    -h     Display help and exit

    Environment variables used:
    Name    Default  Usage
    CC      cc       C compiler command
    CFLAGS  <none>   C compiler flags

여기서 나의 눈에 들어 오는 것이
-r , -T 이었다.


따라서, 다시 한번 옵션을 변경하여 바이너리 파일을 생성해 보자


shc -r -v -T -f ./test.pl



재strace 결과

<...중략...>

rt_sigaction(SIGIO, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL, [], 0}, 8) = 0
close(3)                                = 0
exit_group(0)                           = ?

#


정상적으로 파일 실행되었다.



Posted by 박물지
기초 Linux 서버관리2014. 4. 1. 22:05

tcp        0      0 :::5989                     :::*                        LISTEN      13653/sfcbd


/etc/init.d/sblim-sfcb stop


Posted by 박물지
기초 Linux 서버관리2014. 3. 18. 18:45

쉘에서 time dig naver.com했을 때 출력되는 값 이것을 저장하고 싶을 때,

real    0m0.012s
user    0m0.000s
sys     0m0.004s


( time dig naver.com ) 2> /tmp/output.txt


만약 위에 명령어가 실패하면


{ time dig naver.com ; } 2> /tmp/output.txt


※ 2> 붙여주어야 한다.
    2 > 띄우면 -bash: syntax error near unexpected token `2' 라는 에러가 출력이 된다.


Posted by 박물지
기초 Linux 서버관리2014. 2. 21. 17:42

yum 패키지설치에러 중


cdefs.h 헤더파일이 없어서 확인해 보니 /usr/include/ 디렉토리에 해당 파일이 없었다.

그래서 yum으로 glibc-headers 패키지를 설치 진행하다가

ERROR with rpm_check_debug vs depsolve

에러 문구가 표시 되었다.


Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Updating:
 glibc                   x86_64     2.5-118.el5_10.2  updates           4.8 M
 glibc                   i686       2.5-118.el5_10.2  updates           5.4 M
 glibc-common            x86_64     2.5-118.el5_10.2  updates            16 M
 glibc-headers           x86_64     2.5-118.el5_10.2  updates           602 k
Updating for dependencies:
 glibc-devel             x86_64     2.5-118.el5_10.2  updates           2.4 M
 nscd                    x86_64     2.5-118.el5_10.2  updates           177 k

Transaction Summary
=============================================================================
Install      0 Package(s)
Update       6 Package(s)
Remove       0 Package(s)

Total download size: 30 M
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
ERROR with rpm_check_debug vs depsolve:
Package glibc-devel needs glibc-headers = 2.5-49.el5_5.7, this is not available.
Package glibc-devel needs glibc-headers = 2.5-49.el5_5.7, this is not available.
Package glibc-devel needs glibc = 2.5-49.el5_5.7, this is not available.
Package glibc-devel needs glibc = 2.5-49.el5_5.7, this is not available.
Complete!


필자는 맨 마지막 complete 단어만 보고 설치되었는 줄 알았는데 더 자세치 보니 설치 실패였다.


해결 방법

1) yum clean all

2) yum update yum

3) yum install glibc-headers

4) 설치 완료


Posted by 박물지
기초 Linux 서버관리2014. 2. 18. 12:00

리눅스 서버에 외장하드 Mount하여 파일 복사하기
기본적으로 외장하드 파일시스템은 NTFS이기 때문에 바로 mount가 안 된다.

그래서, 아래와 같은 방법으로 처리하였다.



아래 URL 사이트에서 최신 파일 다운로드

http://www.tuxera.com/community/ntfs-3g-download/



설치 방법
기본적으로 리눅스 development tools 패키지가 설치되어 있어야 한다.
(gcc compiler, libc-dev libraries)

./configure
make
make install


사용 방법

mount -t ntfs-3g /dev/sdc1 /mnt/windows


이상으로 리눅스 서버에 외장하드(NTFS) 파일시스템 Mount 방법 이었습니다.

Posted by 박물지

간혹 Innodb restore하면 하루가 지나도 복원이 안되는 경우가 있다.

그럴 때는 과감히 restore를 중지하고 mysql 환경설정 파일을 수정하자


서버 my.cnf에 아래와 같은 옵션을 추가하면 복원 속도에 박차를 가할 수 있다.


max_allowed_packet = 1000M
bulk_insert_buffer_size = 256M
key_buffer_size = 500M =>이거는 서버 전체 메모리에 60%정도 할당해도 된다.


수정 후 mysql서비스 재시작하고 다시 restore하면 된다.

Posted by 박물지
기초 Linux 서버관리2013. 12. 13. 11:49

서버 엔지니어가 가장 많이 사용하는 명령어 중 하나 free, free -m이라는 명령어이다.

free라는 명령어는 총 메모리, 사용 중인 메모리, 남아 있는 메모리, 가상 메모리를 간단하게 볼 수 있도록 해주는 명령어인데

남아 있는 메모리에 대해서 오해를 하고 있는 부분이 있어서 글을 적어 봅니다.


그럼, 서버에 접속해서 현재 사용 중인 메모리와 남아 있는 메모리에 대해서 확인해 보도록 하겠습니다.


# free
             total       used       free     shared    buffers     cached
Mem:      16359780    9157224    7202556          0     201912    6396404
-/+ buffers/cache:    2558908   13800872
Swap:      3911816        160    3911656


각 항목에 대해서 간단히 설명해 본다.

[Mem] total : Total Physical Memory size
[Mem] used : Total Physical Memory size - Free memory size
[Mem] free : 현재 사용되고 있지 않은 여유 Memory
[Mem] shared : 항상 0이고, 현재 사용되고 있지 않음.
[Mem] buffers : File등의 Meta data를 Cache하고 있는 Physical Memory size
[Mem] cached : File의 Real Data를 Cache하고 있는 Physical Memory size
[-/+ buffers/cache] used- : buffers, cached를 포함하고 있지 않은 used size
[-/+ buffers/cache] free+ : buffers, cached를 포함한 free size
[Swap] total : Total Swap size
[Swap] used : Total Swap size - Free size
[Swap] free : 사용하고 있지 않은 Swap size

free를 입력하면 출력 되는 단위는 kilobyte이다.
우리는 Megabyte에 익숙해져 있으니 free -m 으로 보면 쉽게 얼마나 메모리를 사용하는지 알 수 있다.

다시 본론으로 돌아와서 free 출력 값을 보면 [Mem] free 항목을 보고 현재 남아있는 메모리는 7202328(7033MB)라고
알고 있는 사람들이 있다. 이것은 오해이다.

정확히 말하면 [Mem] free항목은 "남아있는 Memory Size"가 아닌, 어떠한 용도로도 사용되고 있지 않은
Physical Memory Size라고 생각하면 된다.

결론적으로 System 전체의 Memory 사용량의 감시는 [Mem] Free을 판단 기준으로 하는 것이 아니라,
사용가능한 Physical Memory Size로 계산 할 필요가 있다.

계산하는 항목은 아래와 같다.


Memory size ≒MemFree + Inactive


MemFree 와 Inactive 는 /proc/meminfo에 있는 항목이니 cat으로 출력해 보자.


# cat /proc/meminfo
MemTotal:     16359780 kB
MemFree:       7202556 kB
Buffers:        201912 kB
Cached:        6396404 kB
SwapCached:          0 kB
Active:        2578320 kB
Inactive:      6149700 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     16359780 kB
LowFree:       7202556 kB
SwapTotal:     3911816 kB
SwapFree:      3911656 kB
Dirty:             108 kB
Writeback:           0 kB
AnonPages:     2129660 kB
Mapped:          57756 kB
Slab:           383820 kB
PageTables:      15708 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  12091704 kB
Committed_AS:  3042920 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    265072 kB
VmallocChunk: 34359472959 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB


 free로 출력했을 때보다 더 많은 항목들이 출력 되었다.free는 /proc/meminfo에 있는 항목들을 참조하여

보기 쉽게 출력해 주는 명령어이니 좀 더 자세한 메모리 확인을 위해서는 /proc/meminfo 보도록 하자.
(meminfo 항목에 대해서 얘기하면 길어지니 생략하겠다)



               Inactive:       6149700 kB
+           MemFree:       7202556 kB
--------------------------------------
사용 가능한 메모리 :      13800872 kB (약 13.8G)

필자가 초반에 현재 남아있는 메모리는 7202328(7033MB)라고 기재했던 메모리와 5G 정도 차이가 난다는 것을 알 수 있다.
이런 계산법이 어렵거나 빨리 확인을 해야 하는 경우라면 free 입력 후 -/+ buffers/cache:    2558908 13800872 을 보아라.
2558908 kB 가 현재 사용된 메모리이고
총 메모리(16359780 kB)에서 2558908 kB 뺀 값이 현재 사용할 수 있는 메모리이니 꼭 기억해 두었으면 한다.

Posted by 박물지

mysql 기본 보안 명령어이다.

mysql 초기 설치나 재설치 후에 기본적으로 보안 적용할 수 있는 명령어이지만, 이 명령어를 실행하시는 분을 거의 못 봤다ㅎ


사용법을 한번 살펴 보자.



# ./bin/mysql_secure_installation  ==>mysql홈디렉토리에서 실행해야 하니 주의하세요




NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  ==> 현재 mysql 패스워드를 묻네요..전 초기 설치하여 그냥 엔터로 패스
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y ==> mysql root 패스워드를 설정할지 묻는다. 당연히 yes
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y ==> 익명사용자  사용 삭제? 당연히 Yes
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y  ==> mysql 원격 접속 권한 제한. 일단 막고 보자
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y ==>test DB를 삭제할 것인지 묻는다. 나중에 테스트 DB만들어도 되니 일단 삭제
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!



서버 엔지니어분들이라면 기본적인 보안은 갖추고 운영을 하였으면 좋겠다.

Posted by 박물지

폼메일 발송하고 발송상태까지 확인하는 기본적인 폼 메일


<?php

$Name = "YDS"; //senders name
$email = "abc@test.com"; //senders e-mail adress
$recipient = "abcd@test2.com"; //recipient
$mail_body = "Test..."; //mail body
$subject = "Subject for reviever"; //subject
$content="test";
$header = "From: ". $Name . " <" . $email . ">\r\n"; //optional headerfields

mail($recipient, $subject, $mail_body, $header); //mail command :)

 $result=mail($recipient, $subject, $content);
 if($result){
  echo "mail success";
  }else  {

  //error_log($mailto, 0);

  echo "mail fail";
 }
?>


Posted by 박물지

vi /etc/postfix/main.cf 파일을 열어 

relayhost 항목을 찾고 relayhost = 1.2.3.4 와 같이 아이피를 입력해 주고

/etc/init.d/postfix restart 로 마무리 해주면 된다.



※Trouble shooting

메일 로그에 Permission denied 가 뿌려지면 /var/spool/postfix 소유자를 변경해 주면 된다

postfix/master[3946]: warning: master_wakeup_timer_event: service qmgr(public/qmgr): Permission denied   
postfix/master[3946]: warning: master_wakeup_timer_event: service pickup(public/pickup): Permission denied
postfix/master[3946]: warning: master_wakeup_timer_event: service pickup(public/pickup): Permission denied
postfix/master[3946]: warning: master_wakeup_timer_event: service pickup(public/pickup): Permission denied
postfix/master[3946]: warning: master_wakeup_timer_event: service pickup(public/pickup): Permission denied


소유자 변경 방법

# cd /var/spool
# chonw -R postfix:root /var/spool/postfix


Posted by 박물지