레이블이 UNIX인 게시물을 표시합니다. 모든 게시물 표시
레이블이 UNIX인 게시물을 표시합니다. 모든 게시물 표시

2011년 10월 20일 목요일

Shell Prompt 모양 바꾸기


프롬프트의 모양을 변경할 host 의 사용하는 계정의 shell profile 에 아래 내용을 추가한다.


PS1="`hostname`@$LOGNAME:\$PWD  #  "
export PS1


shell profile 은 대게 로그인 한 계정의 홈 디렉토리에 profile 이란 이름으로 존재한다. 파일의 위치와 모양은 시스템의 설정에 따라 다를 수 있으므로 주의.

이렇게 설정하면,

(호스트 이름)@(로그인계정):\(현재디렉토리)  #

와 같은 형태로 프롬프트가 변경된다.

ssh 로그인 없이 자동 접속


A 라는 서버에서 B 라는 서버로 SSH 접속을 시도할 때 암호 입력 없이 바로 접속되는 방법

  1. A 서버에 ssh 접속
  2. $$> ssh-keygen -t rsa
    passphrase 를 입력하라는 메시지가 나오면, 그냥 엔터(=null) 입력한다.
  3. $$> ssh-copy-id -i ~/.ssh/id_rsa.pub {자동 접속할 B서버 계정}@{B서버IP 또는 도메인} 실행
  4. Password: 메시지가 나타나면 자동 접속할 계정의 암호를 평상시처럼 입력한다.
  5. 이후부터 ssh 접속 시 암호를 물어보지 않는다.

만약 이렇게 하였는데도 암호를 계속 물어본다면 B 서버의 sshd 의 설정 파일을 열어서 strict 라는 부분을 찾아서 false 로 고치도록 한다.

sshd 의 설정 파일은 OS 마다 다르지만 대게 /etc/sshd/sshd_config 파일이므로 vi 로 열어서 수정하면 된다.

이 방법은 보안상 매우 위험한 방법이므로, 외부와 확실히 단절된 LAN 내부 연결 호스트끼리만 사용하도록 한다.

tail 명령의 위험성


Web Application Server 를 구동할 때 에러가 발생하는 것을 사전에 탐지하기 위하여, WAS 구동 script 에 log 를 확인하기 위한 UNIX shell tail 명령어를 걸어두는 경우가 많다. 아래가 tail 명령을 사용한 WAS startup script 이다.
#!/bin/sh

JAVA_OPTIONS=......
CLASS_PATH=......

nohup java -cp $CLASSPATH $JAVA_OPTIONS > waslog.out &

tail -f waslog.out
이렇게 작성하면 Java 로 구동된 WAS 가 발생하는 모든 표준 출력이 화면으로 redirect 된다.
그런데, 이것은 대단히 위험한 script 작성 방법 일 수 있다. 큰 시스템 장애를 만들 수도 있다. 만약 개발자 또는 시스템 관리자가 WAS 구동 이후 log 를 tail 하고 있는 상태에서정상적인 UNIX 시스템 Logout 없이 Shell program 이 종료 되면 WAS 가 kill 될 수 있고, 운영 중인 시스템에 큰 데미지를 입힐 수 있다.


그 이유를 알기 위해서는 nohup 으로 WAS 를 구동할 때 일어나는 Process grouping 과 Shell process 의 child invoke 매커니즘을 이해해야 한다.
첫번째, nohup 명령의 동작 특성 대하여 알아보자.
nohup POSIX 명령어는 Process 가 HUP(=Hang up) Signal 을 무시하도록 만든다. 이 HUP Signal 은 사용자가 접속한 Session 의 Shell Process 가 통신을 종료할 때 자식 Process 들에게 전파된다. 그래서 UNIX Shell 에 접속한 상태에서 logout 하는 경우 그 Shell 이 실행했던 모든 Program 이 종료된다. nohup 으로 Process 를 실행하면 HUP Siganl 을 무시하기 때문에 사용자의 login 여부와 상관없이 시스템에서 계속 실행이 되는 것이다.
OS 마다 다르긴 한데 nohup 으로 띄운 Process 는 자신을 실행한 Parent process 가 종료되면 사용자 Session 의 Shell process 의 자식으로 입양되었다가, Shell 이 종료되면 HUP Signal 을 받으면 일시적으로 Orphan process 가 되었다가 System Mothe shell process(=PID 1) 로 입양된다.
두번째, UNIX System 의 Process invocation 에 대하여 알아보자.
아래 그림은 UNIX System 에 접속한 상태에서 WAS 가 구동될 때 Process 의 가계도이다.
nohup Process 가 WAS 프로그램이다. 앞에서 보았듯이 Startup shell script process 가 종료되면 User shell process 로 WAS process 가 입양된다. 그러나 parent 가 종료되지 않으면 계속해서 Shell script process 의 자식으로 남아있게 된다.
tail 명령은 Shell script process 의 Child process 로 구동되는데, 이 녀석은 무한루프를 돌면서 stdout 을 가로챌 준비를 한다. 그러므로 Shell script process 는 자식이 작업을 마치길 기다리느라 종료되지 않는다.
이 상황에서 HUP Signal 이 발생하면 User shell 이 HUP Signal 을 접수하여 자식들에게 HUP 을 전파한다. 그런데 Shell script process 는 HUP 을 전파하지 않고 자신이 종료되어야 하기 때문에 아직 살아있는 Child process 에게 Kill Signal 을 전파하게 된다.
그 결과로 tail 뿐만 아니라 WAS Process 도 HUP 이 아니라 Kill signal 을 받아 죽게 된다.


truss -t\!all -sall -Sall -f ./startWAS.sh >& trusslog.log &
위 명령어는 startWAS.sh 를 실행하였을 때 받게되는 모든 OS Signal 을 trusslog.log 에 저장하는 명령인데 실제로 tail 이 포함된 shell process 가 어떤 OS Signal 을 받는지 기록해보면 tail 명령의 위험성을 더 잘 알 수 있을 것이다. 그리고 HUP Signal 을 고의로 발생시키려면 tail 이 되고 있을 때, Shell program 을 강제종료 시키면 된다.


tail 명령은 WAS 구동 관련 script 에 절대로 있어서는 안 된다. 따로 로그 확인을 위한 script 를 작성하는 것이 좋다.