반응형

OS: Ubuntu 계열 (11.04부터 12.04까지 테스트)



자바(Java)로 서버 소켓을 열고 자기 자신의 IP주소를 다른 연결된 기기에 알려 주는 간단한 프로그램을 짰는데, 이상하게 IP주소가 실제 장비의 IP주소와 다르게 나왔다.

예를 들면, ifconfig 명령을 통해서 나오는 네트워크 인터페이스 주소 192.168.1.6인데, 자바 프로그램에서는 전혀 엉뚱한 192.168.1.17로 인식되는 문제였다. SSH, ping을 비롯한 실제 네트워크 연결은 모두 192.168.1.6으로 정상적으로 수행되는데, 이상하게 Java 코드에서 IP주소를 얻어오는 명령에서는 다른 IP주소를 보게 되는 것이다.



네트워크 설정에 따라서 여러가지 원인이 있을 수 있겠지만, 가장 간단한 원인으로는 /etc/hosts 파일에 IP주소가 잘못 적혀 있는 경우가 있다. 필자의 경우에도 예전에 쓰던 리눅스 머신을 다른 네트워크에 연결시키면서 유동IP를 통해서 새로운 IP주소를 부여받았지만, /etc/hosts 파일에는 예전에 이동하기 전의 IP주소가 기록되어 있는 것을 발견했다.


아래와 같이 /etc/hosts 파일에서 리눅스 머신 이름에 매핑되어 있는 IP주소를 올바른 IP주소로 변경하거나, 아예 해당 라인을 삭제함으로써 해결할 수 있다. 그러나 해당 라인을 아예 삭제할 경우, 상황에 따라 네트워크에 연결하는 특정 프로그램이 작동하지 않을 수도 있으므로 삭제하기 전에 확인이 필요하다.


127.0.0.1  localhost

192.168.1.6  usera-Linux    # IP주소를 올바르게 맞추거나, 해당 라인 삭제




반응형
블로그 이미지

Bryan_

,
반응형


* 여러 파일을 포함하는 디렉토리 전체를 원격 컴퓨터에 전송하기

"-r" 옵션을 주면 디렉토리를 전송할 수 있다.

$ scp -r [디렉토리_이름] [원격지_아이디]@[원격지_주소]:[경로]


예제:

$ scp -r /home/usera/test/ cdsn@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 원격지 컴퓨터의 exp 디렉토리 안에 test 디렉토리가 복사된다.




* 원격 컴퓨터로부터 여러 파일을 포함하는 디렉토리 전체를 받기

$ scp -r [원격지_아이디]@[원격지_주소]:[보내는_디렉토리_경로] [경로]


예제:

$ scp -r remoteuser@192.168.2.8:/home/remoteuser/exp/ /home/usera/

이렇게 하면 로컬 컴퓨터의 usera 디렉토리 안에 exp 디렉토리가 복사된다.




* 여러 개의 파일을 원격 컴퓨터로 보내기

여러 개의 파일을 보낼 때는 그냥 띄어쓰기로 구분해서 파일 이름을 나열하면 모두 전송된다. 만약 공백이 있는 파일 여러개를 보내고 싶다면 파일 하나씩 쌍따옴표(")로 둘러싸면 된다.

$ scp [파일명1] [파일명2] [원격지_아이디]@[원격지_주소]:[받는_위치]


예제:

$ scp /home/usera/111.txt /home/usera/222.txt  remoteuser@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 원격지 컴퓨터의 exp 디렉토리 안에 111.txt와 222.txt가 복사된다.


$ scp "tcp 1111.txt" "tcp 9999.txt" remoteuser@192.168.2.8:/home/remoteuser/exp/

이렇게 하면 띄어쓰기가 포함된 두 개의 파일(tcp 1111.txt, tcp 9999.txt)이 원격지 컴퓨터의 exp 디렉토리 안에 복사된다.




* 원격 컴퓨터에 있는 여러 개의 파일을 로컬 컴퓨터에 받기

하나의 원격지 컴퓨터에 있는 여러 개의 파일을 받을 때는 원격지 주소까지 쓰고 나서 콜론(:) 뒤에 쌍따옴표(")로 둘러싼 영역 안에 여러 개의 파일명을 써주면 된다. 만약 보내는 파일명이 공백을 포함하는 경우에는 그냥 따옴표(')로 해당 파일명을 둘러싸도록 한다.

$ scp [원격지_아이디]@[원격지_주소]:"[파일명1] [파일명2] [파일명3]" [받는 위치]


예제:

$ scp remoteuser@192.168.2.8:"/home/remoteuser/111.txt /home/remoteuser/222.txt" /home/usera/

이렇게 하면 원격지에 있는 111.txt, 222.txt 파일들이 usera 디렉토리 안에 복사된다.


$ scp remoteuser@192.168.2.8:"'/home/remoteuser/tcp 1111.txt' '/home/remoteuser/tcp 9999.txt'" /home/usera/

이렇게 일반 따옴표를 써서 공백이 있는 파일 두 개를 받을 수 있다.




* 아직 되는지 알 수 없는 부분

한 개의 파일을 받을 때 받는 쪽에서 파일이름을 바꿔서 지정할 수는 있지만, 여러 개의 파일을 받을 때 파일 이름을 각각 바꿀 수 있는 방법은 찾지 못했다. 즉, 명령어 한 줄로 여러 개의 파일을 보낼 수는 있지만, 받는 쪽에서 그 여러 개의 파일 이름을 고치고 싶은데 어떻게 해야할 지 아직 모르겠다.

아무래도 scp 명령을 통해서 일단 파일들을 모두 받은 이후에 mv 명령으로 수정하는 방법이 현실적이라고 생각된다.




반응형
블로그 이미지

Bryan_

,
반응형

리눅스 콘솔에서 아래 명령을 통해서, 리눅스의 architecture를 확인할 수 있다.

$ uname -m


위의 명령을 쳤을 때,

i686 이 출력되면 32-bit,

x86_64 가 출력되면 64-bit 시스템이다.



반응형
블로그 이미지

Bryan_

,
반응형

테스트한 OS: Ubuntu 12.04

쉘(shell): bash



* grep만 이용하는 방법


리눅스에서 파일 내에 있는 특정 문자열을 검색할 때 쓰는 grep에 옵션을 더하면 현재 위치에서 하위 디렉토리에 있는 파일들까지 검색을 수행할 수 있다. Ubuntu에서는 grep가 하위 폴더 검색까지 지원하기 때문에 아래와 같이 간단하게 해결할 수 있다.


$ grep -rn "찾고자 하는 문자열" *


-r 옵션은 하위 디렉토리에 있는 파일까지 검색하겠다는 것이고,

-n 옵션은 라인 번호를 보여주는 것이다.

그리고 검색하는 문자열에 공백이 있다면 앞뒤에 따옴표가 반드시 있어야 한다.


그냥 저렇게 실행하면 검색결과보다 "No such file or directory"와 같은 오류 메세지가 더 많이 뜨는 경우도 있다. 이 때는 명령에 "2> /dev/null"을 붙여서 검색 결과만 남겨 두고 에러 메세지는 보이지 않도록 처리할 수 있다. 아래 그림은 openwrt의 build_root 디렉토리 하위의 모든 파일들에 대해서 "setup_fname_info(struct"라는 문자열을 검색한 결과이다.





* find와 grep를 같이 이용하는 방법


그런데 리눅스 배포판에 따라서 grep의 하위 디렉토리 검색이 안되는 경우도 있다고 한다. 어디서 안되는지는 사실 모르겠다. 라우터에 들어가는 매우 가벼운 OpenWRT에서조차 -rn 옵션이 작동하는데 어디서 안되는 것일지?

어쨌든 조금 길고 복잡하지만 같은 목적을 갖는 다른 방법으로 find를 같이 이용하는 방법이 있다.


$ find . -name "*" | xargs grep -n "찾고자 하는 문자열"


참고로 grep와는 달리 find를 쓸 때의 좋은 점은 정규식을 통해서 검색할 파일의 범위를 지정할 수 있는 것이다. 예를 들면, 하위 디렉토리의 모든 .c 또는 .h 파일에 대해서만 검색을 수행하고자 할 때 아래와 같이 할 수 있다.


$ find . -name "*.[ch]" | xargs grep -n "찾고자 하는 문자열"



앞선 예제와 같은 조건에 대해서 find를 이용한 검색 화면은 아래와 같다. 참고로 맨 끝에 붙인 "--color=auto" 옵션은 텍스트와 라인 번호, 키워드 강조 색상을 주기 위해서 필요하다. "--color=auto" 옵션이 없으면 그냥 단색의 결과만 나타난다.




참고로 위의 grep -rn과 달리 검색결과가 3개만 나오는 이유 2가지는 다음과 같다.

 

 - 확인 결과 grep에서 나온 첫번째와 두번째 검색 결과는 같은 파일이다. 경로상에서 보면 build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux-3.10.32는 실제로 존재하는 경로이고, build_dir/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/linux는 같은 위치에 대한 바로가기 링크이다. 즉, grep는 링크도 무시하지 않고 똑같이 하위 디렉토리로 간주하고 검색한다는 얘기.


 - "xmit.c~" 파일은 xmit.c의 백업 파일인데 확장자가 "c~"기 때문에 c와 h 파일만 찾는 정규식에 의해 검색에서 제외되었다.



반응형
블로그 이미지

Bryan_

,
반응형

이 글에서는 리눅스 커맨드 라인에서 특정 디렉토리의 용량을 확인하고, 이를 활용하여 특정 용량 이상의 디렉토리를 검색하는 방법을 설명한다.



특정 디렉토리의 용량 확인하기


리눅스에서 특정 디렉토리의 용량을 확인하려면 du 명령어를 쓰면 된다.


$ du -s [디렉토리_이름]


참고로 -s 옵션은 디렉토리의 하위 디렉토리에 있는 파일들의 용량을 합산하여(summarize) 보여주는 옵션이다. "-s" 옵션을 빼면 디렉토리 내부의 모든 하위 디렉토리의 용량을 보여준 후, 마지막으로 검사하는 디렉토리의 용량을 보여준다.


아래 그림은 du -s를 이용하여 "mc_sc" 디렉토리의 용량을 얻어온 결과이다.


다음 그림은 du만 가지고 "mc_sc" 디렉토리를 검사하였다. 그 결과, 하위 디렉토리를 모두 검사하여 용량을 표시한 후에 마지막으로 mc_sc의 용량을 계산하였다.





특정 용량 이상의 디렉토리 찾기


앞서 살펴본 du -s를 응용하여 wildcard 문자(*)를 쓰면, 현재 위치에 있는 모든 디렉토리의 용량을 찾을 수 있다. 앞서 예제로 확인한 위치에서 du -s * 명령을 친 결과는 아래 그림과 같다. ILQR_exp_data 디렉토리 바로 하위에 있는 디렉토리들에 대해서 각각 합산된 용량을 보여주는 것을 알 수 있다.



그러면 이 중에서 100MB 이상의 용량을 가지는 디렉토리만 보려면 어떻게 할까?

파이프라인(|)으로 awk 명령을 추가해서 출력 결과를 필터링함으로써 이 목적을 달성할 수 있다. 출력 결과의 첫번째 열이 용량을 보여주는 숫자로 되어 있으므로, 첫번째 열의 변수 값($1)이 특정 숫자보다 크도록 조건을 걸면 된다.


아래 명령은 현재 위치에서 100MB 이상의 용량을 갖는 디렉토리를 보여준다. 참고로 뒤의 숫자는 킬로바이트(KB, kilobyte) 단위이다.


$ du -s * | awk '$1 > 100000'


위 명령을 실행한 결과는 다음 그림과 같다.



반응형
블로그 이미지

Bryan_

,