NCDU – 리눅스에서 폴더별 용량 확인

NCDU

우분투에서 폴더의 사용량을 확인하기 위해 항상 du 명령어를 사용했었다.

간단하게 사용이 가능하지만 한눈에 알아보기 힘든 UI로 인해서 고민하다 비주얼하게 출력해주는 프로그램을 하나 만들어 볼까?? 하던차에 구글링을 해보니, 이미 많이 사용되는 프로그램이 있어 소개해본다

일단 콘솔에서 확인해야 하기에 바오밥(https://en.wikipedia.org/wiki/Disk_Usage_Analyzer) 의 경우 X윈도우가 필요하니 패스~

NCDU 설치방법

NCDU를 사용하기 위해서 우분투기준 아래와 같이 설치를 진행한다

#apt-get install ncdu
#ncdu /

실행하고 한참 탐색을 진행하다 마치면 아래와 같은 화면이 나온다. 폴더별로 사용량이 깔끔하게 출력된다.

NCDU 스크린샷1

NCDU 스크린샷2

 

jquery datepicker 한글화

<link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script>
jQuery(function($) {
  $.datepicker.regional['ko'] = {
    closeText : '닫기',
    prevText : '이전달',
    nextText : '다음달',
    currentText : '오늘',
    monthNames : ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
    monthNamesShort : ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
    dayNames : ['일', '월', '화', '수', '목', '금', '토'],
    dayNamesShort : ['일', '월', '화', '수', '목', '금', '토'],
    dayNamesMin : ['일', '월', '화', '수', '목', '금', '토'],
    weekHeader : 'Wk',
    dateFormat : 'yy-mm-dd (DD)',
    firstDay : 0,
    isRTL : false,
    showMonthAfterYear : true,
    yearSuffix : '년'
  };

  $.datepicker.setDefaults($.datepicker.regional['ko']);
});

$(document).ready(function(){
  $(".datepicker").datepicker();
});
</script>

업로드 디렉토리에서 웹쉘 php 실행 방지(webshell)

업로드 디렉토리에서 아래 명령을 실행

# find . -type f | xargs grep -n "eval("
웹쉘파일

파일은 gif형식인데 내용에는 php 코드가 들어있다.

POST로 데이터를 전송하면 eval() 명령으로 실행이 된다.

위와 같은 상황처럼 이미지에 들어있는 php코드가 실행이 되는 것을 방지하지 위해서

아예 업로드 디렉토리는 php파싱을 하지 않도록 하는 방법을 안내한다

/etc/httpd/conf/httpd.conf

<Directory /home/test/public_html/data/>
    php_admin_value engine Off
</Directory>

Solr 검색엔진을 데몬으로 등록 (update-rc.d)

Apache Solr 를 사용하는중에 시스템이 재부팅되면 다시 시작하는게 귀찮아서

구글링을 해보니 데몬으로 등록하는 방법이 있어 스크랩한다.

 

데몬설치

# sudo su

# apt-get install daemon

 

시작스크립트 생성

# cd /etc/init.d/

# cat > solr

[bash]
#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be
# created in the standard location.

start () {
echo -n "Starting solr…"

# start daemon
daemon –chdir=’/usr/local/solr/example’ –command "java -jar start.jar" –respawn –output=/var/log/solr/solr.log –name=solr –verbose

RETVAL=$?
if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}

stop () {
# stop daemon
echo -n "Stopping solr…"

daemon –stop –name=solr –verbose
RETVAL=$?

if [ $RETVAL = 0 ]
then
echo "done."
else
echo "failed. See error code for more information."
fi
return $RETVAL
}

restart () {
daemon –restart –name=solr –verbose
}

status () {
# report on the status of the daemon
daemon –running –verbose –name=solr
return $?
}

case "$1" in
start)
start
;;
status)
status
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: solr {start|status|stop|restart}"
exit 3
;;
esac

exit $RETVAL
[/bash]

# update-rc.d solr defaults

중간에 solr가 설치되어 있는 폴더를 변경해줘야 한다.

 

logrotate 등록

# cd /etc/logrotate.d
# cat > solr

[bash]
/var/log/solr/*.log {
  weekly
  rotate 12
  compress
  delaycompress
  create 640 root root
  postrotate
    /etc/init.d/solr restart
  endscript
}
[/bash]

 

윈도우 방화벽 규칙 추가/삭제 – C#

방화벽 관련해서 참고는 구글링 웹문서들과 mdsn
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa365344(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ff956124(v=vs.85).aspx

c#에서 방화벽에 규칙을 추가하는 방법을 찾던중에
쉽게 할 수 있는 방법이 있어 해당 코드를 안내합니다.

참조추가

FirewallAPI.dll 파일을 참조로 추가합니다.

규칙추가

INetFwRule firewallRule = (INetFwRule)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FWRule"));
 firewallRule.Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW;
 firewallRule.Description = "방화벽 규칙에 대한 설명을 입력합니다";
 firewallRule.Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN;
 firewallRule.ApplicationName = Application.ExecutablePath + @"\app.exe";
 firewallRule.InterfaceTypes = "All";
 firewallRule.Name = "Rule name"; // 방화벽 규칙을 구분하는 이름, 삭제시에도 사용됩니다
 firewallRule.Enabled = true;
 INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
 firewallPolicy.Rules.Add(firewallRule);

규칙삭제

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
 firewallPolicy.Rules.Remove("Rule name");

기존에 추가된 방화벽 규칙을 확인

INetFwPolicy2 firewallPolicy = (INetFwPolicy2)Activator.CreateInstance(Type.GetTypeFromProgID("HNetCfg.FwPolicy2"));
 foreach(INetFwRule rule in firewallPolicy.Rules)
 {
 Console.WriteLine(rule.Name);
 }

C#, PHP – RIJNDAEL 256bit 암/복호화

C#과 php간에 데이터를 주고 받아야 하는데
평문으로 통신하기에 무리가 있던 도중
기존에 사용하던 php 암호화 라이브러리와 연동되는 c# 코드를 발견~
살짝 수정해서 사용하는데 무리가 없음

기본은 128bit지만 256bit로 변경했음
php의 경우 블록에서 남는 부분을 zero로 채워넣기 때문에
c#에서 PaddingMode.Zeros를 설정해야 정상적으로 동작합니다.

Encryption.cs

[csharp]
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace TestClass
{
class Encryption
{
private static byte[] rijnKey = Encoding.UTF8.GetBytes("abcdefg_abcdefg_abcdefg_abcdefg_");
private static byte[] rijnIV = Encoding.UTF8.GetBytes("abcdefg_abcdefg_abcdefg_abcdefg_");

public static String EncryptIt(String s)
{
String result;
RijndaelManaged rijn = new RijndaelManaged();
rijn.Mode = CipherMode.CBC;
rijn.Padding = PaddingMode.Zeros; // php와의 연동에서 꼭 확인
rijn.BlockSize = 256;

using (MemoryStream msEncrypt = new MemoryStream())
{
using (ICryptoTransform encryptor = rijn.CreateEncryptor(rijnKey, rijnIV))
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(s);
}
}
}
result = Convert.ToBase64String(msEncrypt.ToArray());
}
rijn.Clear();

result = Base64UrlEncode(result);

return result;
}

public static String DecryptIt(String s)
{
String result;
RijndaelManaged rijn = new RijndaelManaged();
rijn.Mode = CipherMode.CBC;
rijn.Padding = PaddingMode.Zeros;
rijn.BlockSize = 256;

s = Base64UrlDecode(s);

using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(s)))
{
using (ICryptoTransform decryptor = rijn.CreateDecryptor(rijnKey, rijnIV))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader swDecrypt = new StreamReader(csDecrypt))
{
result = swDecrypt.ReadToEnd();
}
}
}
}
rijn.Clear();

return result;
}

public static string Base64UrlEncode(string arg)
{
arg = arg.Split(‘=’)[0]; // Remove any trailing ‘=’s
arg = arg.Replace(‘+’, ‘-‘); // 62nd char of encoding
arg = arg.Replace(‘/’, ‘_’); // 63rd char of encoding
return arg;
}

public static string Base64UrlDecode(string arg)
{
string s = arg;
s = s.Replace(‘-‘, ‘+’); // 62nd char of encoding
s = s.Replace(‘_’, ‘/’); // 63rd char of encoding
switch (s.Length % 4) // Pad with trailing ‘=’s
{
case 0: break; // No pad chars in this case
case 2: s += "=="; break; // Two pad chars
case 3: s += "="; break; // One pad char
default:
throw new System.Exception("Illegal base64url string!");
}
return s;
}
}
}

[/csharp]

test.php

[php]
//Encryption function
function encryption($encrypt, $key, $iv)
{
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, ”, MCRYPT_MODE_CBC, ”);
mcrypt_generic_init($td, $key, $iv);
$encrypted = mcrypt_generic($td, $encrypt);
$encode = base64_encode($encrypted);
$encode = base64safeEncode($encode);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return $encode;
}

//Decryption function
function decryption($decrypt, $key, $iv)
{
$decoded = base64safeDecode($decrypt);
$decoded = base64_decode($decoded);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, ”, MCRYPT_MODE_CBC, ”);
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $decoded);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return trim($decrypted);
}

function base64safeEncode($data) {
$data = str_replace("=", "", $data);
$data = str_replace("+", "-", $data);
$data = str_replace("/", "_", $data);
return $data;
}

function base64safeDecode($data) {
$data = str_replace("-", "+", $data);
$data = str_replace("_", "/", $data);

switch (strlen($data) % 4) {
case 0: break;
case 2: $data .= "=="; break;
case 3: $data .= "="; break;
}

return $data;
}

$key = "abcdefg_abcdefg_abcdefg_abcdefg_";
$iv = "abcdefg_abcdefg_abcdefg_abcdefg_";

echo encryption("Hello world!", $key, $iv);
echo decryption("1ERpu8RaiyMqsXdjhCEu9IVMyQlz/A3fBR6vGbNxaVs=", $key, $iv);
[/php]

tcpdump

tcpdump

# tcpdump [ -AdDefIKlLnNOpqRStuUvxX ][ -B buffer_size ][ -c count ][ -C file_size ][ -G rotate_seconds ][ -F file ][ -i interface ][ -m module ][ -M secret ][ -r file ][ -s snaplen ][ -T type ][ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,… ][ -y datalinktype ][ -z postrotate-command ][ -Z user ]

# tcpdump -i eth0=> 인터페이스 eth0 을 보여줌

# tcpdump -w tcpdump.log=> 결과를 파일로 저장, txt 가 아닌 bin 형식으로 저장됨

# tcpdump -r tcpdump.log=> 저장한 파일을 읽음

# tcpdump -i eth0 -c 10=> 카운터 10개만 보여줌

# tcpdump -i eth0 tcp port 80=> tcp 80 포트로 통신하는 패킷 보여줌

# tcpdump -i eth0 tcp port 80=> tcp 80 포트로 통신하는 패킷 보여줌

# tcpdump -i eth0 src 192.168.0.1=> source ip 가 이것인 패킷 보여줌

# tcpdump -i eth0 dst 192.168.0.1=> dest ip 가 이것인 패킷 보여줌

 

and 옵션으로 여러가지 조건의 조합 가능

# tcpdump -i eth0 src 192.168.0.1 and tcp port 80=> source ip 가 이것이면서 tcp port 80 인 패킷 보여줌

# tcpdump -i eth0 dst 192.168.0.1=> dest ip 가 이것인 패킷 보여줌

# tcpdump host 192.168.0.1=> host 를 지정하면, 이 ip 로 들어오거가 나가는 양방향 패킷 모두 보여줌

# tcpdump src 192.168.0.1=> host 중에서 src 가 이것인것 만 지정

# tcpdump dst 192.168.0.1=> host 중에서 dst 가 이것인것 만 지정

# tcpdump net 192.168.0.1/24=> CIDR 포맷으로 지정할 수 있다.

# tcpdump tcp=> TCP 인것만

# tcpdump udp=> UDP 인것만

# tcpdump port 3389=> 포트 양뱡항으로 이것인것.

# tcpdump src port 3389=> src 포트가 이것인것.

# tcpdump dst port 3389=> dst 포트가 이것인것.

 

combine : and ( && ) , or ( || ) , not ( ! ) 으로 여러가지를 조합해서 사용 가능

# tcpdump udp and src port 53=> UDP 이고 src 포트가 53 인 것

# tcpdump src x.x.x.x and not dst port 22=> src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것

 

grouping : ( )

# tcpdump ‘src x.x.x.x and ( dst port 3389 or 22 )’=> src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것  ==> 여기서는 ‘ ‘ 가 반드시 있어야 한다.

screw 로 php 소스코드 암호화

php_screw 설치

php_screw 설치하기를 참고하여 php_screw.so를 익스텐션에 올린다

 

screw 컴파일

php_screw 소스를 압축해제한 디렉토리에 tools가 있다
cd tools
make

screw 컴파일

실행파일을 접근가능한 디렉토리로 복사해준다. 여기서는 /usr/bin/ 으로 복사했다
cp screw /usr/bin

 

php 파일 암호화

테스트할 파일을 만든다
echo "" > phpinfo.php

암호화한다
screw phpinfo.php

php_screw

위에처럼 phpinfo.php, phpinfo.php.screw 파일이 생성된다
phpinfo.php 는 암호화 되었고
phpinfo.php.screw 는 원본파일이다

php_screw 를 활용한 php 소스 코드 암호화하는 방법

0. 환경

운영체제 Ubuntu 12.04 LTS (우분투 설치 안내)
php설치
apt-get install php5 php5-dev php-common

 

1. 소스코드 다운로드

http://sourceforge.net/projects/php-screw/files/

캡처

최신버전을 다운로드 하는데,
본글에서는 screw 1.5버전을 기준으로 설명되었습니다.

[php_screw-1.5.tar.gz]
http://sourceforge.net/projects/php-screw/files/latest/download?source=files

 

2. 서버에서 screw 를 다운로드하고 압축을 해제합니다.

wget http://sourceforge.net/projects/php-screw/files/latest/download?source=files
tar xfzp php_screw-1.5.tar.gz
cd php_screw-1.5

 

3. my_screw.h 수정

SEED를 변경합니다.
screw 에서 키값은 암호화/복호화시 사용되므로 아주 중요합니다.
암호화시 사용한 SEED를 이용해 복호화를 하므로 SEED가 다른 소스로 암호화된 소스는 처리가 안됩니다.
vim my_screw.h

short pm9screw_mycryptkey[] = {
11152, 368, 192, 1281, 62
};

적절하게 아래처럼 변경(아래처럼 변수를 늘려도 됨)

short pm9screw_mycryptkey[] = {
12311, 312, 4422, 534, 11, 849, 125
};

 

4. 컴파일

phpize
./configure
make
make install

4.1 컴파일 오류
/usr/local/src/php_screw-1.5/php_screw.c:124:2: error: 'struct _zend_compiler_globals' has no member named 'extended_info'
/usr/local/src/php_screw-1.5/php_screw.c: In function 'zm_shutdown_php_screw':
/usr/local/src/php_screw-1.5/php_screw.c:133:2: error: 'struct _zend_compiler_globals' has no member named 'extended_info'
/usr/local/src/php_screw-1.5/php_screw.c: In function 'pm9screw_compile_file':
/usr/local/src/php_screw-1.5/php_screw.c:81:7: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
/usr/local/src/php_screw-1.5/php_screw.c: In function 'pm9screw_ext_fopen':
/usr/local/src/php_screw-1.5/php_screw.c:36:7: warning: ignoring return value of 'fread', declared with attribute warn_unused_result [-Wunused-result]
make: *** [php_screw.lo] Error 1

위와 같은 오류가 발생할 경우 php_screw.c 파일의 마지막줄에 CG(extended_info) = 1; 줄을 주석처리해준다

PHP_MINIT_FUNCTION(php_screw)
{
//CG(extended_info) = 1;
org_compile_file = zend_compile_file;
zend_compile_file = pm9screw_compile_file;
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(php_screw)
{
//CG(extended_info) = 1;
zend_compile_file = org_compile_file;
return SUCCESS;
}

 

4. so 파일 복사

php5 extension 모듈이 있는 폴더에 복사해준다
cp modules/php_screw.so /usr/lib/php5/20100525/

extension 모듈 디렉토리 위치를 모르는 경우 아래와 같이 확인을 할 수 있다
php -i | grep extension_dir

 

5. php.ini에 php_screw.so 추가

cd /etc/php5/mods-available
echo "extension=php_screw.so" > screw.ini
cd /etc/php5/conf.d
ls -s ../mods-available/screw.ini 90-screw.ini

상황에 따라서 php.ini 파일에 직접 extension=php_screw.so 를 적어주어도 된다.

 

6. apache 웹서버 재시작

/etc/init.d/apache2 restart

 

7. screw 설치확인

php -i | grep screw

php_screw 설치확인

Xenserver – 젠서버에서 Virtual Disk를 생성하고 iso 파일을 복사하기

젠서버(xenserver)에 가상디스크를 생성할 때 ISO파일을 사용하기

iso추가1

 

1. iso 파일을 저장할 디렉토리를 생성합니다.

# cd /home

#mkdir isos

 

iso추가2

 

2. wget, scp 등을 이용해서 디렉토리로 iso파일을 복사합니다.

 

iso추가3

 

[root@ve-server isos]# xe sr-create name-label=isos type=iso device-config:location=/home/isos/ device-config-legacy_mode=true content-type=iso

name-label=(왼쪽 탐색기에 나타날 이름)

device-config:location=(iso 파일이 있는위치)

 

iso추가4

 

isos가 등록되고 저장되어 있는 iso 파일이 보입니다.

 

iso추가5

 

VM을 만들때 isos 디렉토리안의 파일을 활용하여 설치진행이 가능합니다.