Shared Directory

$ sudo vi /etc/samba/smb.conf

  • 참고
    • https://suwoni-codelab.com/linux/2017/05/23/Linux-CentOS-Samba/
    • http://k01kim.tistory.com/428

들어가며:

  우리가 ssh를 접속해서 무언가를 작업을 할때 세션이 타임아웃되서 실행중이던 작업이 종료될때가 있다. 그럼 정말 너무 화가 치밀어 오르며, 다시 접속을 한 뒤에 그전에 작업을 다시 실행한다. 그래서 ssh connection이 끊어져도 작업을 할 수 있는 방법을 찾아보니 nohup을 이용해서 하는 방법이 있다. nohup을 이용하면 결과적으로는 세션이 타임아웃이 되어도, 내가 실행한 작업은 백그라운드에서 계속 실행한다. nohup을 사용하는 방법은 아래와 같다.

nohub 사용하기:

$ nohup command 1>/dev/null 2>&1 &

  위에서 사용하는 명령어에 대해서 이해를 하기 위해서는 아래 내용을 읽어보시기 바랍니다. 

I/O Redirection:

  bash와 다른 shell에서는 I/O redirection을 제공합니다. I/O는 3가지 표준스트림이 존재합니다. 쉽게 말하면 화면에 키보드로 입력하는 스트림, 스크린에 출력을 해주는 스트림, 에러를 출력하는 스트림이 존재합니다. 아래 내용은 키보드, 스크린에 입력하고 출력하는 스트림을 redirection하는 방법에 대해서 설명합니다. 

I/O streams numbers :

- 표준입력(stdin): 0
- 표준출력(stdout): 1
- 표준에러(stderr): 2

1>/dev/null 이란?:

  아래 명령어를 쉘에서 실행을 하면 ls -al의 결과가 result.log에 저장이 됩니다. 

$ ls -al > result.log
$ ls -al 1>result.log

  그렇다면 ls -al의 결과를 화면에 출력하기 싫으면 어떻게 할까요? 간단하게 화면에 출력되는 표준출력을 result.log에 저장하면 됩니다. 파일로도 남기기 싫다면? 그냥 바로 쓰레기통(/dev/null)에 넣어버리면 됩니다. 결과적으로 아래와 같이 입력하면 어떤 값도 화면에 출력되지 않습니다.

$ ls -al > /dev/null
$ ls -al 1>/dev/null

2>&1 이란? (stderr redirect to stdout):

   아래와 같이 입력은 2번 표준에러 파일디스크립터를 1번 파일디스크립터로 redirection 라는 말입니다. 풀어 말하면 1번 표준출력을 /dev/null로 redirection을 했기 때문에, 2번 표준에러도 1번이 redirection하는 /dev/null로 redirection 해라 라는 말입니다. (2—> 1 —> /dev/null)

$ ls -al 2>&1

 & 이란?:

  &는 실행 작업을 백그라운드에서 실행하는 역할을 합니다. 결과적으로는

$ nohub command 1>/dev/null 2>&1

  위 실행을 &(백그라운드)로 보낸다. 입니다. 결과적으로는 로그아웃/세션 타임아웃이 되어도 실행된 커맨드의 화면출력 결과를 /dev/null로 버리고, 에러메시지도 화면에 출력하지 않습니다. 

들어가며:

클라우데라에서 호스트를 추가한 뒤에, 배포하는데서 문제가 발생했다. 에러 내용은 아래와 같다.

Error: rpmdb open failed

의 메시지가 뜨면서 설치가 되지 않았다. 문제를 살펴보니 yum을 실행할때 rpm의 db가 손상될 가능성이 있다고 해서 아래와 같이 해결하였다.

해결방법:

결과적으로 해결하는 방법은 기존 DB를 모두 지우고, 새로 생성을 하면 해결이 된다.

$ sudo rm -f /var/lib/rpm/_db*

$ sudo rpm -vv --rebuilddb

들어가며:

  대량의 파일을 삭제하거나 이동할때, 아래와 같이 에러가 난다. 그 이유는 mv, rm, cp 등 많은 파일에 대해서 파일 개수 제한을 두고 있다. 그렇다면 어떻게 해야지 파일을 옮길 수 있을까. bash에서는 강력한 pipeline(|)이 있기 때문에 잘 활용하면, 간단한 코드도 한줄에 끝낼 수 있으니, 리눅스에서 개발하는 개발자들은 얼마나 커맨드를 아느냐에 따라 시간, 속도를 효율적으로 사용이 가능하다. 

$ mv * ../

에러내용: /usr/bin/mv: Argument list too long

아래와 같이 사용하면 대량의 파일을 옮기거나 삭제가 가능하다. 

$ find . -type f | xargs -i mv "{}" ../ 


들어가며

  새로운 HDD, SSD 등 스토리지가 추가가 되면, 포맷을 하고 마운트를 하게 된다. 아래 내용은 추가된 스토리지 /dev/xvdb를 포맷하고, /mnt/data1에 마운트 하는 방법에 대해서 설명한다. 데이터를 다루는 작업을 한다면 필수.

포맷하기 

$ sudo /sbin/mkfs.ext3 /dev/xvdb

마운트하기

$ sudo mkdir /mnt/data1
$ sudo mount /dev/xvdb /mnt/data1 

들어가며

  linux에서 ssh키를 이용해 서버에 접속하는 경우가 많습니다. 특히 분산처리할때는 ssh키를 등록해 놓고 처리를 해야지 패스워드 없이 작업을 원활하게 진행이 가능합니다. 그렇다면 ssh키를 등록한다는 말이 무엇을까요? ssh-key는 내가 너의 비밀번호를 이미 알고 있으니, 다음부터는 너한테 비밀번호 물어보지 않고 접속할께 알겠지? 라는 의미라고 생각하시면 됩니다. 

  등록하는 방법은 서버와 클라이언트로 나누어서 생각하면, 서버는 내가 ssh를 통해 접속하고자 하는 컴퓨터를 의미하고, 클라이언트는 서버에 접속하기 위한 컴퓨터라고 생각하시면 됩니다. 클라이언트에서 ssh키를 생성하고, 생성된 키를 서버에다가 등록해주면 끝입니다. 그럼 생성하고 등록하는 방법에 대해서 알아보도록 하겠습니다.

ssh key 생성하기

$ ssh-keygen -t rsa

ssh key 등록하기

ssh-keygen으로 생성된 ~/.ssh/rsa.pub의 정보를 authorized_keys에 등록하시면 됩니다. 이때 등록하기 위한 방법은 rsa.pub을 접속하고자 하는 서버에 ~/.ssh/authorized_keys에 넣으면 됩니다. 이때 만약에 id_rsa.pub을 파일을 옮기기 위해서는 scp를 사용하시면 됩니다. 

$ cat id_dsa.pub >> authorized_keys

이렇게 등록을 하고나면 ssh로 접속할때 비밀번호를 물어보지 않고, 바로 접속이 가능합니다. 


ssh key 생성 및 등록 한방에

  위에서는 ssh를 생성하고, 등록하는 원리를 이해하시고 실제 하실때는 아래와 같이 하는게 훨씬더 수월합니다.  ssh-copy-id의 명령어를 사용하시면 됩니다. 이 명령어는 내가 접속을 하는 컴퓨터에서 ssh-copy-id를 사용하시면 되고 뒤에 쓰는 계정과 호스트는 서버를 쓰시면 됩니다. 예를 들어서 내가 host1에서 host2를 접속하고 싶을때는 host1에서 

$ ssh-copy-id account@host2

를 입력하면 알아서 host2의 ~/.ssh/authorized_keys에 host1의 ~/.ssh/id_dsa.pub의 내용이 복사가 됩니다. 

이후에는 host1에서 

$ ssh account@host2

를 하시면 비밀번호 없이 접속이 가능합니다.

  1. kirby 2017.03.22 10:12

    $ ssh-keygen -t dsa 오타났음요
    dsa -> rsa로 변경하셈

    • 2017.03.22 12:10

      비밀댓글입니다

들어가며

  서버에서 작업을 하다보면 나의 로컬에 있는 데이터를 서버로 전송하거나, 서버에 있는 데이터를 내 로컬로 전송을 해야 하는 경우가 있습니다. 그럴때는 Ubuntu에서 제공하는 기본 커맨드인 scp를 사용하시면 됩니다.  scp는 Security CoPy의 약자로 보안이 보장된 복사라고 할 수 있습니다. 보안이 보장 되었다는 말은 무엇이냐, 우리가 ssh를 통해 서버에 접속을 하면 22번 포트가 open이 되어 있어야 합니다. scp는 ssh와 동일한 포트를 사용하여 SSL기반의 세션 보안 프로토콜을 사용하기 때문에 기존에 사용하던 FTP와 다르게 보안측면에서 뛰어납니다.

$ scp <source_path> <username>@<ip>:<dest_path>

  • source_path : 내가 복사하고자 하는 파일이 경로를 입력합니다.
  • username : 사용자 계정 아이디를 입력하시면 됩니다.
  • ip : 복사하려고 하는 목적지 IP주소 또는 도메인 이름을 지정합니다.
  • dest_path : 복사하려고하는 목적지의 파일 저장 경로를 지정합니다.

파일을 복사하는 방법

$ scp /home/banana/test.txt lee@192.168.1.19:/home/lee/test.txt

  위의 예를 보면 /home/banana에 있는 test.txt의 파일을 192.168.1.19의 계정 lee의 /home/lee/test.txt로 복사를 한다는 말과 동일합니다. 여기서 주의해야할 사항은 192.168.1.19의 lee계정의 비밀번호를 알아야 합니다. 

폴더를 복사하는 방법

$ scp -r /home/banana lee@192.168.1.19:/home/lee

  기존 위에 파일을 복사하는 방법과 달라진점은 source_path, dest_path가 모두 경로가 되었다는 점과, scp의 파라미터로 -r을 넘겨줬습니다. -r은 mv에서도 많이 사용했듯이 recursive하게 모든 내용을 복사하겠다는 내용을 뜻합니다. 

AWS의 s3에 복사하는 방법

$ scp -r -i public_key.pem /home/banana lee@192.168.1.19:/home/lee

  아마존 같은 경우에는 S3에 접속 할 수 있는 key를 주게 되는데요. 확장자가 *.pem으로 끝나는 파일입니다. -i의 옵션과 함께 identity file을 넘겨주시면 됩니다. 

Vi/Vim에서 레지스터를 이용해 복사, 잘라내기, 붙여내기 하는 방법

yy, dd를 이용해 복사 및 붙여넣기를 했고, pp를 통해 붙여넣기를 수행했습니다. 하지만, pp를 통해 붙여넣기전에 yy,dd를 했다면, 그 이전에 있는 내용이 아닌 가장 최근의 값을 사용하게 됩니다. 즉, 하나의 버퍼를 사용해서 복사, 잘라내기, 붙여넣기를 수행하고 있습니다.

vi에서는 내부 register를 지원하고 있습니다. 아주 간단한 방법으로 동작합니다. 일단 :reg를 입력하면 현재 register의 항목을 볼 수 있습니다.

" " "0 "1 "2 "3 "4 "5 "6 "7 "8 "9 "- ". "% "# "/

  • "" 레지스터 -> 바로 이전에 지워진 내용이 항상 들어 갑니다
  • "1 ~ "9 레지스터 -> 지워진 내용이 큐 형식으로 들어 갑니다
  • ". 레지스터 -> 최근까지 타이핑 한 내용이 들어 갑니다
  • "% 레지스터 -> 현재 편집하는 파일명이 들어 갑니다
  • "/ 레지스터 -> 가장 최근에 검색한 문자열이 들어 갑니다

register에 저장되어 있는 항목은 "", "1 ~ "9, ". , "%, "/가 있습니다. 레지스터에 들어가는 순서는 큐(queue)의 형태로 들어갑니다. 바로 이전에 지워진 내용이 들어가는 "", 그 이후에는 "1 ,"2, "3, ... "9의 순서로 들어가게 됩니다.

그렇다면 레지스터를 우리가 직접 입력이 가능합니다. 나는 1번 레지스터와, 2번 레지스터에 복사를 하고 싶으면 "1yy를 하시면 됩니다. 복사한 값을 붙여넣기 위해서는 "1pp를 하시면 됩니다. 여기서 "를 안하시면... 그냥 한줄 붙여넣기이기 때문에 "을 꼭해줘야 합니다.

그 외에도 (a~z)의 레지스터를 지원하고 있으니, 반복되는 값은 register에 등록해놓고 사용하셔도 좋을 것 같습니다. 하지만 다시 시작하면, 없어진다는 점! 말 그대로 register, buffer입니다.

Ubuntu에 Java설치 및 환경 설정하는 방법

Ubuntu에서 apt-get으로 Java를 설치하고, 환경변수를 설정하는 방법에 대해서 설명하겠습니다.

  일단 설치하기에 앞서, java를 설치할때 어떤 설치 항목이 있는지 살펴보면 JRE, JDK가 있습니다. 그럼 각각 어떤 역할을 하는지 알고, 내가 필요한 부분만 설치하시면됩니다. JRE (Java Runtime Environment) 즉, 자바로 구현이 되어있는데 프로그램을 동작시킬 때 필요한 라이브러리들과, 기타 파일들을 가지고 있다. JRE는 JVM의 실행 환경을 구현했다고 생각하면 된다. JDK (Java Development Kit)은 JRE + 개발을 위한 도구(javac, java 등)을 포함합니다. 그럼 내가 만약 개발자라면 JRE가 아닌 JDK를 설치해야겠지요.


설치하기

sudo apt-get update

# java의 설치 유무를 파악하고...
java -version

sudo apt-get install default-jdk
sudo apt-get install default-jre


# OpenJDK7을 설치하기 위해서는
sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-6-jre

sudo apt-get install openjdk-7-jdk
sudo apt-get install openjdk-6-jdk

# Oracle JDK를 설치하기 위해서는
sudo apt-get install oracle-java7-installer
sudo apt-get install oracle-java6-installer


환경설정

Java 관리하기

여러개의 java가 설치되어 있다면, 내가 원하는 java를 default로 설정하는 방법이 있다.

sudo update-alternatives --config java

를 하면 선택이 가능하다.

JAVA_HOME 설정하기

sudo update-alternatives --config java를 통해 내가 설치한 java의 경로를 확인하고, 경로를

sudo vi /etc/environment

에 입력하면 된다. 입력을 한 뒤에 /etc/environment의 파일을 reload하면 설정이 끝난다. 

JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64"
source /etc/environment

echo $JAVA_HOME 을 통해 확인이 가능하다.

ls -l | wc -l


wc는 파일의 라인수, bytes, character의 개수를 셀때 사용하는 커맨드입니다. 

만약 ls -l을 하면 현재 폴더의 파일의 개수가 나올 것 이고,

그 결과의 wc -l을 하기 때문에 현재 파일의 개수가 출력이 됩니다. 



+ Recent posts