하면 된다!!!

File Transfer - scp, rsync

프로그래밍/기타

 

서버 작업을 하다보면 서버와 서버 사이에 파일 전송 이슈가 있는 경우가 있다.

개인적으로 주로 SFTP나 FTP를 이용해서 파일을 전송했었는데... 요즘은 rsync 를 이용해서 파일 전송을 주로 하고 있습니다.

그중 많이 쓰이는 scp, rsync 에 대해서... 간단히 커맨드 정리 해둔다.

 

SCP (Secure Copy) 

ssh를 통해서 파일을 전송하는 도구로 서버에서 서버로 쌍방향 전송이 가능하다.

 

다른 장비로 파일 복사하기
scp -rp sourcedirectory user@dest:/path
-r means recursive
-p preserves modification times, access times, and modes from the original file.
scp *.pdf sean@123.12.1.123:/home/sean/download/
>> 모든 PDF 파일을 123.12.1.123 서버의 /home/sean/download 폴더로 복사
scp -rp ~/files sean@123.12.1.123:/home/sean/download/
>> files 폴더 이하에 있는 모든 파일을 123.12.1.123 서버의 /home/sean/download 폴더로 복사

 

다른 장비에서 파일 복사해오기
scp -rp user@dest:/path sourcedirectory
scp sean@123.12.1.123:/home/sean/download/*.pdf ./download
>> 123.12.1.123 서버의 /home/sean/download 폴더의 모든 PDF 파일을 ./download 폴더로 복사
scp -rp sean@123.12.1.123:/home/sean/download/ ~/files 
>> 123.12.1.123 서버의 /home/sean/download 폴더 하위의 모든 파일을 ~/files 폴더로 복사

참고로 파일명에 공백 등이 들어간 경우 " " 로 둘러싸주면 된다. ex) "abc file.txt" 

 

 

rsync

서버간에 파일을 동기화하는 도구이다. 이 또한 쌍방향 전송이 가능하다.

필자는 AWS에서 서버 관리를 주로 하고 있는데 인증 파일(.pem)을 이용해서 서버에 파일을 싱크할때 자주 사용하고 있다.

파일 싱크하기 (일반)
rsync -a -e ssh user@source-server:/source/ /dest/
rsync -a -e ssh /source/ user@source-server:/dest/

-a : archive mode (include a lot of default common options, including preserving symlinks)
-z : compress
-v : verbose : show files
-P : show progess as files done/remaining files
-e ssh : do rsync in ssh protocol
--delete : delete files in the destination that are not anymore in the source
rsync -avz -e ssh pi@123.12.1.123:download/ files/
>> 123.12.1.123 서버의 download 폴더의 파일을 ./files 폴더로 복사
rsync -avz -e ssh files/ pi@123.12.1.123:download/
>> ~/files 의 파일들을 123.12.1.123 서버의 /home/sean/download 폴더로 복사
인증서 파일 (.pem) 파일을 이용해서 싱크하기
sudo rsync -avzP -e "ssh -i /root/.ssh/my_certificate.pem" /source/ user@source-server:/dest/
sudo rsync -avzP -e "ssh -i /root/.ssh/my_certificate.pem" user@source-server:/source/ /dest/

 

root 유저로 ssh 접근 제어 해야할 때

프로그래밍/기타

ssh를 이용해서 외부 접근을 하는 경우에 root 유저로 붙을 수 있게 되면 아무래도 보안상 위험하겠지요.

원격으로 해킹 시도가 상당히 발생할 수 있습니다.


이에 따라서 root 유저는 통상적으로 ssh 접근을 못하도록 하고, 일반 유저로 접근해서 su 또는 sudo를 이용해서 접근하도록 제어합니다.


$ sudo vi /etc/ssh/sshd_config

PermitRootLogin yes    << yes : 접근, no : 접근 안됨


$ sudo systemctl restart sshd  << sshd 서비스 재기동 (centos의 경우)


접속을 시도해보시면... 로그인이 안되도록 변경됩니다.



CentOS - SVN 설치시 에러

프로그래밍/기타

CentOS에 svnserve를 설치하다가...


이 사이트 참고 했음 : http://b1ix.net/290


설명이 매우 잘 되어있어서 따라하면 땡...


다만 중간 부분에 나와있는 이 부분!!!


[root@localhost checkout1]# svn checkout svn://localhost/svn_repos svn: E000013: Unable to connect to a repository at URL 'svn://localhost/svn_repos' svn: E000013: file '/home/svn/svn_repos/format' 를 열 수 없습니다: 허가 거부


이에 대한 해결책이 필요했다.

위의 에러는 selinux가 보안상 막고 있어서 발생하는 것이 맞다.


이를 해결 하기 위해서는... repository 타깃이 되는 폴더명을 뒤에 써준다.


$ chcon -R -t svnserve_content_t /home/svn/svn_repos


이렇게 해주면 된다.

selinux를 그냥 disabled 시켜 버리면 보안에 구멍이~!!!


Linux 프로세스 관리 쉘

프로그래밍/기타

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


1. 특정 프로세스를 찾아서 죽이기


#!/bin/bash

ps -ef | grep -v grep | grep 프로세스명 | awk '{print $2}' | xargs --no-run-if-empty kill -9 $1



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


2. 특정 프로세스가 살아있는지 체크해서 죽어있으면 살리는 쉘


$ vi /var/test/run.sh


#!/bin/bash

PROCESS_CNT=`ps -ef | grep 프로세스명 | grep -v grep | awk '{print $2}' | wc -l`

if [ "$PROCESS_CNT" == 0 ];

then

    echo "[`/bin/date +\%Y\%m\%d_\%H\%M\%S`] Process : Dead!!"

    실행시킬_프로세스명

else

    echo "[`/bin/date +\%Y\%m\%d_\%H\%M\%S`] Process : Alive!!"

    exit 0

fi


위와 같은 쉘을 하나 만들어두고 crontab 에 1분에 한번씩 돌게 해주면 1분에 1회씩 프로세스가 살아있는지 체크하고 죽어있으면 실행 시키도록 할 수 있다.


$ crontab -e

* * * * * /var/test/run.sh >> /var/test/proc_mon.log


$ tail -f /var/test/proc_mon.log

1분에 1회씩 로그가 쌓이는 것을 확인할 수 있습니다.



SSH 접속 세션 시간 조정

프로그래밍/기타

SSH 접속이 자주 끊겨서 고생하는 경우들이 있는데... 그에 대한 해결책을 간단히 노트해둔다.

  1. SSH 클라이언트 접속 시간 조정
    • sudo vi /etc/ssh/ssh_config
    • # otehr configs 부분에 아래 내용을 주석 해제하고 숫자값을 정해준다.
      ServerAliveInterval 100

  2.  SSHD 서버에서의 접속 시간 조정
    • sudo vi /etc/ssh/sshd_config
    • 아래와 같이 주석 해제하고 값을 지정해주시면 됩니다.
      ClientAliveInterval 600
      TCPKeepAlive yes
      ClientAliveCountMax 10
    • SSHD 서버 재기동이 필요합니다.
      $ sudo service ssh restart


Jenkins 포스트 쉘 스크립트 권한 관련 문제

프로그래밍/Java

리눅스 장비에 jenkins 를 설치하고나서 배포를 하다가 포스트 쉘 스크립트를 넣었다가 권한 문제로 에러를 여러차례 겪었는데...


jenkins는 jenkins 유저를 사용하고 있기 때문에 사용하려는 쉘에 접근하기 위해서는 권한이 필요했다.


이를 해결하기 위해서 jenkins 유저에 sudo 권한을 주고 포스트 쉘 쪽에는 sudo /path/to/abcd.sh 이렇게 처리를 해보는 것으로...


우선 sudoers에 유저와 권한을 넣어줘야 한다.


$ vi /etc/sudoers

# User_Alias ADMINS = jsmith, mikem << 요런 라인이 있는데 이 라인 아래에다가...


jenkins ALL=(ALL) NOPASSWD: ALL


이렇게 추가해준다.

NOPASSWD 라고 해주면 sudo 명령을 내리더라도 비번을 별도로 묻지 않게 됩니다.


물론 이렇게 셋팅을 하게 되면 sudo 커맨드를 이용해서 루트 권한으로 모든 커맨드를 실행할 수 있으니 문제가 있을 수 있다.

권한을 축소하려면 특정 경로나 파일을 지정해서 열어주는 것도 방법이다.


맨 뒤에 있는 ALL 을 대신해서 경로나 파일을 지정해주면 된다.


jenkins ALL=(ALL) NOPASSWD: /root/deployshell/


이런 식으로 해두게 되면 /root/deployshell/ 디렉토리 하단에 대한 권한을 지정해줄 수도 있다.


나이먹고 이런 삽질은 참 쉽지 않다. ㅠㅠ 어릴때 공부해뒀어야 하는데... 하는 생각뿐이다.


Raspberry PI 에 NginX 웹 서버, 톰캣 설치하기

마이 스토리/Raspberry PI 놀이

뭐 이 부분은 따로 설명한 부분도 아니다.

데비안 계열의 리눅스이기 때무네 apt-get 을 이용해서 원하는 패키지를 넣으면 설치가 된다


NGINX 설치하기

sudo apt-get install nginx


Tomcat 8 설치하기

sudo apt-get install tomcat8


설치하면 프로세스까지 자동으로 서비스까지 올라간다.


NginX와 Tomcat 연동은 뭐... 굳이 여기서 설명 필요 없을 것 같아서 생략~



호스트 파일 컨트롤 해주는 확장프로그램 (애드온)

프로그래밍/기타

개발을 하다보면 호스트 파일 정보를 수시로 바꿔가면서 개발을 해야하는 경우가 많다.

이런 경우 hosts 파일을 열어놓고 수정해가면서 작업을 해야하는데... 불편함이 이만 저만이 아니다.

이런 부분을 쉽게 해결해주는 웹 브라우저의 똑똑한 확장 프로그램이 있다.


HostAdmin 이라는 툴이며 구글 크롬과 파이어폭스를 지원한다.


구글 코드에 프로젝트가 있는데...  https://github.com/tg123/chrome-hostadmin


크롬은 아래의 URL로 접근하면 바로 설치가능하다.

https://chrome.google.com/webstore/detail/hostadmin/oklkidkfohahankieehkeenbillligdn


파이어폭스도 HostAdmin 이라는 이름으로 애드온을 검색하면 바로 설치 가능하다.



설치를 하고 나면 화면 상단에 다음과 같은 아이콘이 나타나는데...



클릭을 하면 Hosts 파일에 등록된 내역들이 도메인별로 주루룩 그루핑 되어 나타난다.

특정 도메인을 지정 아이피로 선택을 할 수 있다.

원하는 아이피를 선택해가면서 사용하시면 됩니다. 이 경우 DNS 리프레시를 자동으로 해주기 때문에 브라우저에 다른 작업을 하실 필요가 없다.


다만 각 OS별로 hosts 파일은 사용 권한이 제한되어있다.

따라서 다음과 같이 권한 처리를 해주셔야 제대로 구동을 시킬수 있다.

아래 URL에 들어가면 상세한 내용이 나타난다.


https://code.google.com/p/fire-hostadmin/wiki/GAIN_HOSTS_WRITE_PERM


요약하면 아래 내용...

Windows Vista/7

To Users group

cacls %windir%/system32/drivers/etc/hosts /E /G Users:W

Custom User account

cacls %windir%/system32/drivers/etc/hosts /E /G "User Account Name":W

Linux (Ubuntu Fedora ...)

sudo chmod og+w /etc/hosts

Mac OS X

sudo chmod og+w /etc/hosts





[Android] 안드로이드 오픈소스 게임 개발 프레임워크 1. LibGDX

프로그래밍/Mobile
안드로이드 개발 프레임워크들을 좀 알아봐야한다. 
자료 조사 겸 포스팅 조사 순서는 필자 맘데로... 별로 머... 우선순위 개념 없이 조사하는데로 올린다. 

제가 조사하지 않은 것들 중에 괜찮은 것이 있으시면 댓글로 추천해주시면 좋겠네요. 아직 이쪽 바닥은 잘 몰라서요. 

 첫 번째는 LibGDX 


 Crossplatform 을 지원한다. 
게임이나 앱을 한번 만들어서 여러개의 플랫폼에서 사용할 수 있도록 해주는데 아래의 OS를 지원한다. 
iOS뿐 아니라 GWT (Google Web Toolkit)을 이용해서 웹 서비스도 가능하다. 
  • Windows
  • Linux
  • Mac OS X
  • Android (1.5+)
  • iOS (requires a MonoTouch license, 79$ for students, 399$ otherwise) << 돈내고 사야하는데... 서비스 해야 할 경우만
  • Javascript/WebGL (GWT) 

오픈 소스 프로젝트는 문서가 잘 안나와서 문제가 되는데 관련 문서와 샘플 소스들이 잘 갖춰져 있다. (상용화 하려는 듯) 

대부분 영문자료들이 많아서 고생하시는 분들을 위해서 몇몇 블로거들이 정리를 잘 해두셨구나. (졸라 땡큐~ ^^)
한글로 정리를 잘해주신 블로그 및 사이트들 링크를 남겨본다. 

호루루님의 블로그 : http://starkapin.tistory.com/474

공부 좀 더 해서 자료 정리해서 올려야겠네요.



Linux Find command 정리 자료 (펌)

프로그래밍/기타

원문 : http://coffeenix.net/board_view.php?cata_code=95&bd_code=36


제  목 : 유용한 find 명령어 예 모음
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 수시로 추가했음

아래는 제가 자주 쓰는 find 명령인데, 유용할 듯 해서.
지금까지 적어뒀던 것과 아주 보편적이라고 생각되는 것입니다.
계속 추가됩니다. ^^

-------------------------------------------------------
1. 현재 디렉토리( . ) 이하에 확장자가 .html( -name "*.html" ) 인 파일만 ( -type -f )

find . -name "*.html" -type f -ls

2. 파일 크기

# 파일 크기가 300KB 이상( -size +300k )인 파일만 
# (호스팅되는 홈피내에 큰 사이트의 파일이 있는지 찾을 때 유용)
find . -size +300k -ls

# 파일 크기가 500bytes 이하( -size -500c )인 파일만  
find . -size -500c -ls 

3. 수정일

# 수정한지 20일 이상( -mtime +20 )된 파일과 디렉토리
find . -mtime +20 -ls 

# 수정한지 20일 이상된 파일만
find . -mtime +20 -type f -ls

# 수정한지 20일 이상된 파일만 삭제 ( -exec rm {} \; ) 
# (정기적으로 20일이 지난 파일을 삭제할 때 유용)
find . -mtime +20 -type f -ls -exec rm {} \;

# 수정한지 3일 이내( -mtime -3 )의 파일만 (백업할 때 유용)
find . -mtime -3 -type f -ls

# 수정한지 30분 이내( -mmin -30 )의 파일만
find . -mmin -30 -type f -ls

4. 퍼미션 및 파일 소유

# 파일시스템 전체( / )에서 SUID/SGID가 설정된 모든 파일 목록을 얻음
find / -type f \( -perm -04000 -o -perm -02000 \) -ls

# 소유자가 없는 파일 목록을 얻음 (사용자는 이미 삭제했는데, 파일이 남은 경우)
find / -nouser -o -nogroup

5. 출력 형식 지정

# 출력 형식을 printf로 만들어서 (출력 결과를 다른 프로그램에서 받아서 쓸 때 유용)
# %h = 경로, %f = 파일명, %k = KB, %s = Bytes

# 형식 : <경로/파일명> <파일크기KB>
find . -printf "%h/%f \t %kKB \n"
... 생략 ...
./public_html/phps/icon/type/pcx.gif      4KB
./public_html/phps/icon/type/ra.gif       4KB
./public_html/phps/icon/type/sound.gif    4KB
./public_html/phps/icon/type/text.gif     4KB

# 형식 : <경로/파일명> <파일크기Bytes>
find . -printf "%h/%f \t %sKB \n"
... 생략 ...
./public_html/phps/icon/type/movie.gif    912Bytes
./public_html/phps/icon/type/mp3.gif      958Bytes
./public_html/phps/icon/type/pcx.gif      897Bytes
./public_html/phps/icon/type/ra.gif       903Bytes
./public_html/phps/icon/type/sound.gif    932Bytes

6. 홈페이지 포팅할 때 퍼미션 안 맞는 경우 유용한 것

# 확장자가 .htm* .gif, .js, .css 인 것만 퍼미션을 644(rw-r--r--)로
find . -name "*.htm*" -o -name "*.gif" -o -name "*.js" -o -name "*.css" -exec chmod 644 {} \;

# 파일은 퍼미션을 644로
find . -type f -exec chmod 644 {} \;

# 디렉토리는 퍼미션을 701로
find . -type d -exec chmod 701 {} \;

# 하위의 모든 퍼미션을 바꾸지 않고 depth를 지정하여 제한을 둘 때
# 옵션 : -maxdepth 숫자  (1=현재디렉토리만, 2=현재디렉토리 포함하여 한단계 하위디렉토리까지만)
find . -maxdepth 1 -type d -exec chmod 701 {} \;

※ -maxdepth는 -type나 -perm 등의 조건연산자가 아닌 옵션이다. 
   따라서 조건연산자보다 먼저 사용해야한다. (다른 명령처럼 옵션을 먼저쓰는 것으로 이해하면 됨)
   find . -type -d -maxdepth 1 과 같이 사용하는 것은 옳지 않다.