본문 바로가기

Linux

Linux #23

A site B site 사이의 보안 연결을 위해서

Linux 시스템으로 IPsec Openvpn을 이용한 연결이 가능하다.

** IPsec는 셀프 스터디

=>나중에 Router 장비를 사용해서 Network로 연결하는 것도 가능하다.

 

  패키지와 파일, 서비스 등의 중앙관리 도구 - Puppet Ansible

  Puppet은 네트워크상의 Linux 시스템들의 소프트웨어나 명령 등을 중앙에서 일괄적으로 관리하게 해주는 도구이다. 여기서 관리 서버의 역할을 하는 머신을 Puppet master로 부르고 이 master 머신을 통해서 여러 대의 Puppet agent로 불리는 Puppet 클라이언트 호스트들을 관리한다. Puppet 서버인 master는 각 Puppet 클라이언트인 agent의 상태를 수집할 수 있게 설정되어져 있고, Puppet agent들은 매 30분마다 Puppet master에 접속해서 자신들의 정보와 서버의 정보를 비교해서 서버에 새로운 업데이트된 정보(manifest(명세) 파일에서 설정)가 있으면 받아와서 자신을 업데이트하는 구조이다. 

  Puppet master 서버에서 ~.pp 매니페스트 파일에 작업 지시 등 필요한 것을 설정해주면 agent 노드들에 적용되므로 많은 클라이언트들을 일괄적으로 관리할 때 매우 편리하다. 

 

  Puppet 패키지, 서비스, 그리고 파일

  Puppet master라는 중앙 관리서버에서 각 Puppet agent 클라이언트들에 대해서 사용자뿐만 아니라 패키지, 서비스, 그리고 파일 등을 구성시켜줄 수 있다. 서버에 *.pp 확장자를 가지는 management manifest(관리 명세) 파일을 생성 한 뒤 puppet apply 명령어로 클라이언트들에게 배포하면 클라이언트들은 이 파일에 지정된 속성대로 업데이트된다.

=>Ansible puppet manifest 파일을 통해서 작업을 지시하는 것처럼

  playbook을 통해서 작업을 지시한다. 서버에서만 작업하고 클라이언트에서 설정해줄 것은 없다.

 

  (shell)

  쉘에는 최초의 쉘인 Borune Shell, 버클리 대학에서 만들었고 프로그램 개발에 적합한 C Shell Tcsh shell, 그리고 Bourne Shell의 발전된 형태로 C Shell의 모든 기능을 가지고 있는 Korn Shell 등이 있다. 대부분 Linux 배포판의 디폴트 쉘은 Bourne Shell의 한 종류인 Bash(Borune Again SHell)로써 /bin/bash에 자리하고 있다.

일반 사용자는 Bourne, Bash Korn 쉘에서 $,

             C 쉘에서는 %로 쉘 프롬프트가 표시되고,

root 관리자는 모두 #으로 쉘 프롬프트가 표시된다.

 

  디폴트 쉘 프롬프트는 '[사용자@호스트_명 작업_디렉터리]$' 모양인데 PS1 쉘 변수에 저장되어 있으므로 쉘의 모양을 변경하려면 이 PS1 변수를 조절하면 된다.

a. PS1="\u@\h \W>" 하면 [root@centos ~]#에서 root@centos ~>로 변경된다.

b. PS1="[\u@\h \W][\d]$" 하면 [root@centos ~]# 프롬프트 뒤에 [요일 월 일]이 표시되고,

c. PS1="[\T][\u@\h \W]#" 하면 [root@centos ~]# 프롬프트 앞에 [시간]이 표시된다

 

일반 사용자가 생성한 쉘 스크립트를 파일이 위치한 곳 이외에서 누구든지 실행되게 하려면 /usr/local/bin에 넣어두면 된다.

 

  변수

  데이터나 정보를 처리하기 위해서 데이터를 메모리에 저장해 두면 빠르게 해당 데이터를 사용할 수 있다. 메모리는 작은 공간(셀로 부름)으로 분할되어 있고, 각 셀마다 16진법의 주소를 가지고 있다. Linux에서는 시스템이 생성하고 유지하는 보통 대문자로 표시되는

시스템 변수(System Variables)와 사용자가 생성하고 유지하는 보통 소문자로 표시되는

사용자_정의 변수(User Defined Variables)가 있다.

  메모리 내의 A 저장 공간에 들어있는 10(A=10)이라는 데이터() 12(A=12)로 바꿔주면 A 저장 공간에는 이제 바뀐 12라는 데이터를 가지고 있게 되므로 A 저장 공간은 넣어주는 데이터에 따라서 가지고 있는 값이 변하기 때문에 변수(Variable)라고 부르고 $A로 불러내서 사용한다.

  쉘에서의 변수는 C와 같은 프로그래밍 언어에서처럼 미리 변수를 선언한 뒤 사용하지 않고 사용할 때 그 자리에서 선언해주고 사용하면 된다.

 

  변수_명은 $뒤에 쓰는데

영문자나 _로 시작되어야 하고,

변수_명은 대소문자를 구분한다.

no=10 해주고, echo $no 하면 변수에 저장된 값 10을 보이지만,

echo $No 하면 $No는 다른 변수로 취급되므로 아무 값도 보이지 않는다.

=>pwd라는 명령어를 $(pwd) 하면 이 명령어의 결과가 변수로 취급된다.

? *와 같이 예약된 지시어는 변수_명으로 사용될 수 없다.

변수_값은 숫자나 문자, 문장이 될 수 있는데 문장은 " "로 묶어서 표시한다.

변수_=구문에서 = 전후에 공간이 있어서는 안 된다!!. 

변수_명에 홑 따옴표 ' '와 겹 따옴표 " "를 붙였을 때 각각 의미가 다르다.

 

  시스템 변수

  변수를 보는 'echo $변수_' 'printenv 변수_($가 없음)'과 같은 명령어이다. 시스템 변수_명에는 BASH, BASH_VERSION, COLUMNS, LINES, LOGNAME, OSTYPE, PATH, PS1, PWD, SHELL, USERNAME, HOSTNAME 등이 있는데 특별한 일이 없으면 이 시스템 변수 값을 바꿀 필요는 없다.

  printenv UNIX 시스템에서의 변수 확인 명령어인데 Linux에서도 일부 사용되고 있는데 변수_명에 $를 붙이지 않는다.

 

** root가 작성한 실행파일 ~.sh /usr/local/bin 아래에 두면 누구나 실행할 수 있다!!!

 

  환경변수

  쉘의 환경변수는 'export 변수_=' 형식으로 설정하는데

 

  ls -a $HOME/ 하면 현재 사용자의 디폴트 설정 파일들을 볼 수 있다.

.bash_profile은 처음 시스템에 로그인할 때 로드되어 Login Shell에서 실행된다. 대부분 개별 사용자에 대한 설정이다.

=>.bash_profile은 처음 로그인해서 쉘로 들어갈 때 적용되는 설정이고

.bashrc는 이미 로그인 한 상태에서 새 터미널 창을 열거나 새롭게 설치한 프로그램의 실행 경로 등을 지정할 때 사용된다. Non-Login Shell에서 실행되고 Alias 등이 들어간다.

=>.bashrc는 로그온 한 다음 쉘로 작업할 때 적용되는 설정이다.

profile는 처음 로그인할 때 로드되는데 환경변수가 적용된다. .bashrc와 비슷하게 작동되지만 개별 사용자에 대한 설정 중에서 bash와 관계없는 환경변수가 적용된다.

=>profile bash가 아니더라도 로그인 할 때 로드된다.

 

  Login Shell ssh로 접속하거나 su로 다른 사용자로 들어갈 때 적용되어 터미널을 띄우거나 bash 명령어를 사용해서 쉘이 실행될 때 적용된다.  /etc/profile, .bash_profile이나 /etc/bashrc, .bashrc이 사용되고, Non-Login Shell은 로그인이 필요하지 않은 쉘을 실행하는 경우에 사용된다.

==>사용자의 .bashrc 파일을 설정한 뒤에는 반드시

   source .bashrc 해서 변경을 적용시켜주어야 한다!!!!

 

  변수끼리 계산은 다음 방식대로 해주면 된다.

변수끼리 계산하려면 `expr ~ ` |bc 구문을 사용해서 계산식을 적는데 변수가 문자이기 때문에 숫자를 문자열로 취급하기 쉬워서 `expr ~ ` 계산식 내에서

+ , - , * , / , 그리고 %(나머지) 기호 전후에는 빈 공간이 있어야하고,

곱하기 *는 와일드 문자(*)와 동일하므로 \를 사용해서 \* 처럼 해주어야 한다

  (하지만 최근 버전은 그냥 * 해도 된다). 그리고

괄호도 \( \)를 사용해야 하고, ( ) 전후에도 빈 공간이 있어야 한다는 규칙이 있다. 

  사용자 입력 받기

  사용자의 입력을 받아서 처리해야 할 때가 많다. 변수 값을 입력받아서 저장할 때 read 변수_명을 사용한다. 위에서는 C 프로그램이어서 변수명=read() 함수를 사용했다.

 

  파라미터 변수

  쉘 스크립트를 실행할 때 인자를 함께 주어서 스크립트내의 변수에 대입시켜서 실행되게 할 수 있는데 이 때 입력하는 외부 인자들을 '파라미터 변수'라고 부르며 쉘 프로그램 안에서 차례로 $0, $1, $2,... 변수_명의 값으로 대입된다. $*은 모든 인자를 다 보이고, $#은 인자의 개수를 보이라는 의미이다. 

 

  상수를 알아보자.

  메모리 공간 A라는 주소에 저장된 값 10을 변경시키지 않고 사용한다면 변수(variable) 대신 상수(constant)로 처리해 주면 되는데 'readonly 상수_' 혹은 'declare -r 상수_'형식으로 상수를 선언한다. 변수에서는 var라는 변수에 10을 넣었다가, 100을 넣어서 그때그때 $var로 불러서 사용했는데,

a. readonly const=100(OR declare –r const=100) 해서 const를 상수로 선언하면 const 100이라는 값만 가지게 되고

b. 역시 echo $const식으로 사용한다. 주로 문자열이나 해당 스크립트 내에서 고정된 값을 유지시켜야 할 때 상수를 사용한다.

c. 변수와 다르게 또 다시 const=200식으로 값을 변경하려고 하면 변경되지 않는다. 

 

  배열(array)

  같은 종류의 변수(문자, 숫자, 문자열, ...)를 여럿 사용할 때 이들을 일일이 변수_1, 변수-2, 변수_3, ...을 생성해서 값을 넣어주면 프로그램이 엉성해지고 길어지고, 관리하기도 힘들어 진다. 이럴 때 배열 []을 사용하면 깔끔해지는데 배열의 요소는 보통 '배열_=( 1 2 3 )' 해서 나열 한 뒤,

${배열_[index 배열_번호]} 해서 개별 요소나,

${배열_[@]} 해서 모든(그룹) 요소,

${배열_[*]}해서 포인터(메모리 주소) 요소에 접근할 수 있다.

=>배열의 첫 번째 요소는 인덱스[0]부터 시작된다.

  인덱스를 ${NAME[2]}식으로 표현하면 NAME[] 배열의 세 번째 요소를 지시한다.

 

  참고로 요긴한 기능 몇 가지를 더 알아보자.

seq는 연속한 숫자 등을 표시하는데

seq 1 5는 세로로 1~5를 보이고,

echo $(seq 1 5)는 가로로 1~5를 보인다.

mkdir $(seq 1 5) && ls 해보면 세로로 1~5 디렉터리가 생성된 것을 볼 수 있다. 숫자만 되고 $(A D)식으로 하면 오류가 뜬다.

rmdir $(seq 1 5) 해서 일괄 삭제할 수 있다.

echo 명령어 구문을 변수에 넣을 수도 있다.

a=$(echo 'hello' | tr '[:lower:]' '[:upper:]')

b=$(echo 'WoRLd' | tr '[:upper:]' '[:lower:]') 하고 (_는 한 칸 띄움)

=>[:number:], [:alnum:], ....

echo "$a $b" 해본다.

수식 계산을 간단히 할 수 있는데

echo "43–10 is $(( 43 – 10 ))" 해본다.

'Linux' 카테고리의 다른 글

Linux #25  (0) 2023.05.03
Linux #24  (0) 2023.05.03
Linux #22  (0) 2023.05.03
Linux #21  (0) 2023.04.03
Linux #20  (0) 2023.03.29