상세 컨텐츠

본문 제목

Linux Command 공부 - linuxcommand.org (2)

개발공부/개발공부

by Dal_pang 2022. 12. 6. 17:28

본문

I/O Redirection

 

Standard Input

: 키보드로 입력받는 기본 입력 방식도 있지만 "<" 문자를 사용해 파일을 통한 입력을 할 수 있다. (입력 리다이렉션.)

또한,  ">" 문자를 통해 입력 한 파일을 처리한 후, 출력할 수 있음. (출력 리다이렉션) 리다이렉션 연산자의 순서는 중요하지 않음.

단, "<", ">" 옵션은 명령어의 다른 옵션 및 인자들 이후에 사용해야 한다.

 

Pipelines

I/O 리다이렉션을 통해 여러 명령어의 조합 즉, 파이프라인 형성 가능.

ls -l | less

위의 커맨드를 사용하면 ls 명령어의 결과물이 less 커맨드의 인자로 입력된다.

 

다른 예제

Command 기능
ls -lt | head Displays the 10 newest files in the current directory.
du | sort -nr Displays a list of directories and how much space they consume, sorted from the largest to the smallest.
find . -type f -print | wc -l Displays the total number of files in the current working directory and all of its subdirectories.

 

Filters

sort : 표준 입력된 데이터를 정렬 후 표준 출력.

uniq  : 표준 입력을 통해 정렬된 데이터 스트림에서 중복된 값들을 제거.

grep : 표준 입력을 통해 입력받는 각각의 입력 라인을 검사해 특정 패턴을 갖고 있는 라인을 출력.

        *** globally search a regular expression and print. 'g/re/p'

fmt : 표준 입력을 통해 텍스트를 읽어 들인 후 포매팅된 텍스트를 출력.

pr : 표준 입력으로 입력받은 텍스트를 페이지별로 나누고 header, footer를 적용해 출력 준비를 한다.

head : 입력값 중 가장 앞에 있는 몇 개의 라인만 가져와서 출력.

tail : 입력값중 가장 뒤에 있는 몇 라인만 출력.

tr : upper/lowercase 변경 또는, 줄 종료 문자 타입 변경 시 사용. 

sed : 스트림 에디터. tr보다 정교하게 사용 가능. 

awk : filter 구성을 위한 프로그램 언어.

 

 

커맨드 라인을 통한 프린트 출력

lpr

: accepts standard input and sends it to the printer

다음과 같이 사용 가능.

cat poorly_formatted_report.txt | fmt | pr | lpr

cat unsorted_list_with_dupes.txt | sort | uniq | pr | lpr

* cat : read file and output it to standard output.

 

tar 파일 읽기.

tar tzvf name_of_file.tar.gz | less

 


Expansion

-> shell에서 echo * 와 같은 명령어를 사용 시, echo가 입력받는 값은 * 가 아니라, * 가 의미하는 것으로 대체된 이후의 것을 입력받는다.

 

Pathname Expansion

예제는 다음과 같다.

 

Tilde Expansion

~ : 현재 유저의 홈 디렉토리 

~user_name : 해당 유저의 홈 디렉토리

 

Arithmetic Expansion

echo $((2 + 2))

multiple subexpressions.

echo $(($((5**2)) * 3))

echo $(((5**2) * 3))

-> 동일 결과.

 

 

Brace Expansion

: 중괄호 확장.

The brace expression itself may contain either a comma separated list of strings, or a range of integers or single characters.

 

examples

echo Number_{1..5}
=> Number_1 Number_2 Number_3 Number_4 Number_5
echo {Z..A}
=> Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
echo a{A{1,2},B{3,4}}b
=> aA1b aA2b aB3b aB4b

"년-월"형식의 폴더를 다량 만든다던지 하는 번거로운 일을 할 때 유용하게 사용 가능.

 

 

Parameter Expansion

 

USER contains our user name.

echo $USER

=> me

 

 

Command Substitution

명령어 출력물을 expansion에 사용 가능.

echo $(ls)

ls -l $(which cp)

file $(ls /usr/bin/* | grep bin/zip)
// pipeline의 결과물이 명령어의 인자로 들어가게됨.

* 예전 쉘 프로그램에서 사용하던 back-quotes를 $대신 사용할 수도 있음

ls -l `which cp`

 

Quoting

- 불필요한 빈 공간이 자동으로 삭제되거나, $뒤에 온 문자가 undefined variable이면 삭제하는 문제.

Double Quotes

ex) "two words.txt"와 같이 중간에 띄어쓰기가 입력된 경우 ""를 사용하여 커맨드 사용 가능.

[me@linuxbox me]$ ls -l "two words.txt"
-rw-rw-r-- 1 me me 18 2020-02-20 13:03 two words.txt
[me@linuxbox me]$ mv "two words.txt" two_words.txt

단, parameter expansion, arithmetic expansion, and command substitution의 경우 큰따옴표 안에서도 그대로 작동.

echo "$USER $((2+2)) $(cal)"

 

word-splitting이 제한되므로 다음과 같이 ""와 함께 사용 시 word-splitting 제대로 출력 가능.

[me@linuxbox me]$ echo $(cal)
February 2020 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
[me@linuxbox me]$  echo "$(cal)"
February 2020
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

 

 

Single Quotes

: 모든 제약들에 대해 escape 하고 싶은 경우 사용.

[me@linuxbox me]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/me/ls-output.txt a b foo 4 me
[me@linuxbox me]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 me
[me@linuxbox me]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

' ' 사이의 모든 것들은 입력된 그대로 작동. expansion이 적용되지 않는다.

 

 

Escaping Characters

하나의 문자만 quote 하고 싶은 경우. '\'를 해당 문자 앞에 붙여서 사용 가능.

[me@linuxbox me]$ echo "The balance for user $USER is: \$5.00"
The balance for user me is: $5.00
[me@linuxbox me]$ mv bad\&filename good_filename

backslash 사용 시에는 "\\"라고 사용.

single quotes안에서 사용할 경우 제 역할을 못한다는 점 잊지 말 것!

 

 

More Backslash Tricks

-r

--reverse

위 두 개의 커맨드는 동일한 역할을 한다. 알아보기 쉽게 하기 위해 길게 사용할 경우 한 줄로 길게 쓰는 것보다 backslash를 사용해 한눈에 알아보기 편하게 사용할 수 있음.

ls -l \
   --reverse \
   --human-readable \
   --full-time

 

 

Excape Character Name Possible Uses
\n newline Adding blank lines to text
\t tab Inserting horizontal tabs to text
\a alert Makes our terminal beep
\\ backslash Inserts a backslash
\f formfeed Sending this to our printer ejects the page

 

echo -e 코맨드를 통해 실습 가능.

[me@linuxbox me]$ echo -e "Inserting several blank lines\n\n\n"
Inserting several blank lines

[me@linuxbox me]$ echo -e "Words\tseparated\tby\thorizontal\ttabs."
Words separated   by  horizontal  tabs
[me@linuxbox me]$ echo -e "\aMy computer went \"beep\"."
My computer went "beep".
[me@linuxbox me]$ echo -e "DEL C:\\WIN2K\\LEGACY_OS.EXE"
DEL C:\WIN2K\LEGACY_OS.EXE

Permissions

유닉스-like 운영체제, 즉 리눅스 같은 운영체제는 멀티태스킹뿐만 아니라 멀티 유저를 지원한다.

컴퓨터가 네트워크나 인터넷에 접속되어 있는 경우, 원격으로 유저가 ssh(secure shell)을 통해 컴퓨터에 접속하여 작동시킬 수 있음.

 

command list

- chmod : modify file access rights

- su : temporarily become the superuser

- sudo : temporarily become the superuser

- chown : change file ownership

- chgrp : change a file's group ownership

 

File Permissions

리눅스 시스템 내 모든 파일 및 디렉토리는 소유자, 멤버, 이외 모든 사람에 대한 접근 권한을 부여받는다. 권한은 read, write, execute(프로그램 실행)로 구성.

ls -l /bin/bash

위와 같이 ls 커맨드를 통해 확인 가능.

 

-> /bin/bash 파일은 root 유저가 소유

-> 슈퍼유저는 rwx권한 모두 보유

-> 파일 소유 그룹은 root

-> root그룹의 멤버는 read, execute 권한 보유

-> 이외의 사람들 모두 read, execute 권한 보유

 

 

출력 결과 앞의 접근권한은 다음과 같이 구성.

 

chmod

The chmod command is used to change the permissions of a file or directory.
파일에 대한 접근 권한 변경 방법 2가지.

1) chmod MODE 파라미터.

 

아래의 이미지를 참고하여 각 사용자에 대한 접근권한 부여 및 제거 가능.

파일이 속한 그룹이 실행할 수 있는 권한 추가.
$ chmod  g+x  FILE
시스템의 모든 사용자가 읽을 수만 있는 권한 지정.
$ chmod  a=r  FILE
파일을 소유한 그룹과 그 외 사용자의 모든 권한 제거.
$ chmod  go-rwx  FILE

 

2) 팔진법(Octal notation)을 사용한 권한 부여

예) 어떤 파일에 대하여 소유자만 읽고 쓰기 가능하고, 나머지 사람들에게부터 비공개로 유지하려면 다음과 같이 작성 가능.

chmod 600 some_file

자주 사용되는 권한 부여 세팅.

7 : read + write + execute

6 : read + write

5 : read + execute

4 : read

0 : 권한 없음.

 


Directory Permission

chmod를 사용해 디렉토리 접근 권한 제어 가능.

이때 사용하는 r, w, x는 파일 권한과 다르다.

r : 디렉터리 내 content 리스트 출력 권한(x 권한이 부여된 경우만 가능).

w : 디렉토리 내 파일 생성, 삭제, 이름바꾸기 권한(x 권한이 부여된 경우만 가능).

x : 디렉토리 접근 권한 (cd dir를 통해 디렉토리 enter)

 

Value Meaning
777 (rwxrwxrwx) No restrictions on permissions. Anybody may list files, create new files in the directory and delete files in the directory. Generally not a good setting.
755 (rwxr-xr-x) The directory owner has full access. All others may list the directory, but cannot create files nor delete them. This setting is common for directories that you wish to share with other users.
700 (rwx------) The directory owner has full access. Nobody else has any rights. This setting is useful for directories that only the owner may use and must be kept private from others.

7 : 디렉토리 내 파일 리스트 출력, 파일 생성 삭제 이름변경 가능, 디렉토리 접근 가능

5 : 디렉토리 내 파일 리스트 출력, 디렉토리 접근 가능

0 : 권한 없음.

 

 

임시로 슈퍼 유저 권한 부여

su : substitute user

슈퍼 유저 권한에 임시 접근 가능한 프로그램 명령어. 

 

[me@linuxbox me]$ su
Password:
[root@linuxbox me]#

superuser의 password입력 후 세션 접속 가능.

exit 명령어를 통해 슈퍼 유저 세션 종료 가능.

 

단, 대부분의 경우 su 대신 sudo를 사용함.

 

 

*** 처음 su 명령어를 통해 superuser 로 접근하려 할때 로그인 비밀번호를 치고 들어가도 Sorry라며 접근 불가능하게 나온다.

비밀번호 초기 설정이 안되어 있는 상태라서 나오는 에러.

'su' 대신 'sudo -s' 를 치고 비밀번호 입력 후 -> 'passwd root' 을 입력해 슈퍼 유저의 비밀번호를 설정해주면

다음부터 su를 통해 superuser로 접속 가능하다!

 

sudo

[me@linuxbox me]$ sudo some_command
Password for me:
[me@linuxbox me]$

sudo 사용 시에는 superuser 비밀번호가 아닌 해당 유저의 비밀번호를 입력.

* 최근의 배포판에서는 root account 비밀번호 세팅을 아예 하지 않는데, 루트 유저의 접근을 막기 위해서 이다. 꼭 필요한 경우 sudo 명령어와 ''-i" 옵션을 통해 root shell 접근 가능.

 

 

Change File Ownership

chown

파일 소유자 변경.

[me@linuxbox me]$ sudo chown you some_file

some_file의 소유자를 me에서 you로 바꾸기 위한 커맨드.

*** 파일의 소유자를 바꾸기 위해서는 슈퍼 유저 권한을 갖고 있어야 한다. 위의 예제도 chown명령어를 쓰기 위해 sudo 명령어를 사용함!

디렉터리 소유자 바꾸는 경우도 동일하다.

 

Changing Group Ownership

chgrp

파일 또는 디렉토리 소유 그룹 변경 시 사용하는 커맨드.

[me@linuxbox me]$ chgrp new_group some_file

파일 또는 디렉터리의 소유자만 chgrp 커맨드 사용 가능. 

 


Job Control

- 리눅스의 멀티 태스킹.

 

ps : list the processes running on the system

kill : send a signal to one or more processes(usually to "kill" a process)

jobs : an alternate way of listing your own processes

bg : put a process in the background

fg : put a process in the foreground

 

Putting a Program into the Backgrond

1) 실행 시 & 입력.

[me@linuxbox me]$ xload &
[1] 1223
[me@linuxbox me]$

2) 실행 파일을 중지(ctrl-z) 시킨 후, bg입력으로 background에서 실행.

[me@linuxbox me]$ xload
[2]+ Stopped xload

[me@linuxbox me]$ bg
[2]+ xload &

 

Listing Running Processes

jobs, ps

[me@linuxbox me]$ jobs
[1]+ Running xload&

[me@linuxbox me]$ ps
PID  TTY   TIME     CMD
1211 pts/4 00:00:00 bash
1246 pts/4 00:00:00 xload
1247 pts/4 00:00:00 ps

[me@linuxbox me]$

 

Killing  a Process

kill

[me@linuxbox me]$ xload &
[1] 1292

[me@linuxbox me]$ jobs
[1]+ Running xload&

[me@linuxbox me]$ kill %1

[me@linuxbox me]$ xload &
[2] 1293
[1] Terminated xload

[me@linuxbox me]$ ps
PID  TTY   TIME     CMD
1280 pts/5 00:00:00 bash
1293 pts/5 00:00:00 xload
1294 pts/5 00:00:00 ps

[me@linuxbox me]$ kill 1293
[2]+ Terminated xload

[me@linuxbox me]$

 

Kill 커맨드

kill 커맨드가 작동 중인 프로세스를 kill 하기 위해 사용되지만, 사실 프로세스에 신호를 보내기 위해 사용되는 것.

kill -l

위 커맨드를 통해 제공되는 신호의 종류 확인 가능. 

 

Signal # Name Description
1 SIGHUP Hang up signal. Programs can listen for this signal and act upon it. This signal is sent to processes running in a terminal when you close the terminal.
2 SIGINT Interrupt signal. This signal is given to processes to interrupt them. Programs can process this signal and act upon it. We can also issue this signal directly by typing Ctrl-c in the terminal window where the program is running.
15 SIGTERM Termination signal. This signal is given to processes to terminate them. Again, programs can process this signal and act upon it. This is the default signal sent by the kill command if no signal is specified.
9 SIGKILL Kill signal. This signal causes the immediate termination of the process by the Linux kernel. Programs cannot listen for this signal.

 

프로그램 종료 방법

1. ps 커맨드를 사용해 종료하기 위한 프로세스의 프로세스 아이디(PID) 확인.

2. kill 커맨드 실행

3. 종료되지 않은 경우 (무시하는 경우), 강제 종료 신호를 보내 작업 종료시키기.

[me@linuxbox me]$ ps x | grep bad_program
PID  TTY   STAT TIME COMMAND
2931 pts/5 SN   0:00 bad_program

[me@linuxbox me]$ kill -SIGTERM 2931

[me@linuxbox me]$ kill -SIGKILL 2931

* kill 커맨드의 디폴트 값이 -SIGTERM이므로 다음과 같이 사용도 가능.

[me@linuxbox me]$ kill 2931

* kill로 종료 안될 경우 SIGKILL로 종료할 때 다음의 커맨드도 동일한 역할을 한다.

[me@linuxbox me]$ kill -9 2931

 

728x90

관련글 더보기