[Centos 7] Standard I/O Redirection

2022. 11. 16. 13:41리눅스(Linux)

표준 입력과 출력
$ 표준 입출력 기능은 입력/출력을 다루는 기본적인 방법을 제공
   - 기본 입출력 스트린(I/O stream)에는 표준 입력, 표준 출력, 표준 에러 가 있다
   - 표준 입력 ( 0 ) ---> 키보드
   - 표준 출력 ( 1 ) ---> 모니터
   - 포준 에러 ( 2 ) ---> 모니터 

표준 입출력에 사용하는 기호

$ 표준 입력 사용
   - 일반적으로 키보드를 주로 사용하며, 파일을 직접 열수 있는 명령은 표준입력 스트림을 지정하지 않아도되지만 파일을 직접 열수 없는 명령어 에서는 표준 입력 스트림을 유용하게 사용할 수 있다

# cat test_file 
# mail user1 < send.txt
   - 일반적으로 키보드를 주로 사용하며, 파일을 직접 열수 있는 명령은 
   표준입력 스트림을 지정하지 않아도되지만 파일을 직접 열수 없는 명령어
   에서는 표준 입력 스트림을 유용하게 사용할 수 있다
# cat << c > test_file 
   - 지정된 문자열 "C" 가 입력되면 입력 중지

 

 

 

$ 표준 출력 사용

 

# cat 
# cat test_file 
# cat < test_file 
   - 키보드나 파일로 부터 입력 받은 값을 표준 출력 장치(모니터)로 출력
   
# cat > output 
# cat test_file > output1 
# cat < test_file > output2 
   - 리다이렉션 기호를 사용하면 표준 출력 장치가 아닌 파일로 출력

# cat >> output 
# cat test_file >> output1 
# cat < test_file >> output2 
   - 더블 리다이렉션 기호를 사용하면 표준 출력 되어질 파일에 내용 추가

 

Redirection 사용예제

$ 명령어 예제

# find / -name “*.c” > foundit 2> /dev/null 
   - 루트 디렉터리에서 .c 로 끝나는 파일 이름들을 검색하여, 찾아진 이름들을 
   foundit 파일로 출력하며, find 명령어의 에러는 /dev/null 파일로 보내진다

# find / -name “*.c” > foundit 2>&1 
   - 루트 디렉터리에서 .c 로 끝나는 파일 이름들을 검색하여 foundit 파일로 
   출력하며 발생하는 에러 메시지는 표준출력 (파일식별자 1)과 같은 곳(foundit)으로 보낸다

# ls /etc/passwd /etc/password 2>&1 > result.txt 
   - Command 수행 결과 에러메시지를 표준출력(화면)으로 보내고 나머지 
   수행 결과를 result.txt 파일로 출력
   
# ls /etc/passwd /etc/password > result.txt 2>&1 
   - 순서를 바꾸면 동작하지 않는다, 에러메시지 및 수행 결과 모두 
   result.txt 파일로 출력됨

 

$ 파이프(pipe)
   - 한 프로그램의 출력을 중간 파일 없이 다른 파일의 입력으로 바로 보내는 유닉스 매커니즘
   - 파이프는 파이프( | ) 기호 왼쪽 명령어의 출력을 오른쪽 명령어의 입력으로 보낸다
   - 파이프라인은 하나 이상의 파이프로 구성된다

 

$ 명령어 예제

# cat /etc/profile | more 
   - /etc/profile의 내용을 한페이지 단위로 출력

# cat /etc/passwd | sort -r | more 
   -  /etc/passwd 파일의 내용을 역으로 정렬하면서 한 페이지 단위로 출력

 

$ Pipe 와 Redirection 사용예제

# ls /etc/rc5.d | sort -r | grep S > result.txt 
   - 파일 목록을 역으로 정렬하며 목록 중“S”를 포함하는 라인을 추출하여 
   그 결과를 result.txt에 출력

# ls /etc/rc5.d | sort -r > result.txt | grep S 
   -  출력이 result.txt 로 향해 있기 때문에 grep 명령어의 입력으로 전달되지 않는다(X)

 

# who | wc -l 
3 
 
# du -ch | sort -n | sed -n '$p' 
4.8M 합계
   - 시스템에 로그인한 사용자수 확인

파이프(pipe)

 

 

# ls /etc/rc5.d | sort -r | tee result.txt | grep S 
   - Tee 명령어는 표준 입력으로부터 읽은 결과를 표준 출력 및 파일에 쓰기를 
   하므로 grep 까지 결과값이 도달한다

$ 이름있는 파이프(FIFO : First In First Out)
   - 서로 연관되지 않은 두 프로세스 사이에서 데이터를 주고받을 수 있는것이 이름있는 파이프라고 한다
   - 명령행에서 파이프 기호( | )를 사용할 때는 파이프를 통해서 데이터를 주고받는 두 프로세스가 같은 쉘에서 시작된 것이어야 한다

# mkfifo /down/fifo 
# cat < /down/fifo 
 
2009. 05. 22. (금) 22:21:45 KST 
2009. 05. 22. (금) 22:21:48 KST 
2009. 05. 22. (금) 22:21:51 KST 
2009. 05. 22. (금) 22:21:54 KST 
2009. 05. 22. (금) 22:21:57 KST 
2009. 05. 22. (금) 22:22:00 KST
   - Process 1
   
# cat > /down/fifo.test 
while sleep 3 
do date 
done 
Ctrl +d 
 
# . /down/fifo.test > /down/fifo 
   - Process 2
# find / -user root -perm -4000 -exec ls -l {} \; > ./setuid  2> /dev/null
   - 허가되지 않은 특수권한 실행파일이 있는지 검사해서 당장 지워야한다

-user root -perm -4000 → 특수권한 4000 setuid 의미
2> → 에러메세지가 뜨면 오른쪽으로 보내라
/dev/null → 휴지통
> ./setuid  2> /dev/null → setuid를 생성하고 만약 오류 메세지가 뜨는 부분은 휴지통으로 보내라