shell_script

shell - system 관련 스크립트

sysman 2021. 8. 2. 17:38

계정 생성 쉘 스크립트

 

 

필요 내용

- 사용자 계정 ID, 패스워드

- 사용자 계정 명령어 : useradd

- 패스워드 명령어 : passwd

 

프로세스

1) 사용자 계정 , 패스워드 입력

2) 일벽 정보가 없으면 에러 메세시 출력 후 종료

3) 여러 명 사용자 계정을 생성할 경우 for문 사용

4) 생성하고자 하는 사용자 계정이 있는지 확인

5) 사용자 계정이 없으면 사용자 계정을 생성하고, 패스워드 설정

6) 만약 사용자 계정이 있으면 계정이 있다고 메세지 보여줌

 

#vi /etc/hosts

host01 1.1.1.1

host02 1.1.1.2

 

[team01@test1 08.System]$ cat '8.1 adduser-script.sh'
#!/bin/bash

# 사용자 계정 및 패스워드가 입력되었는지 확인
#사용자 패스워드, ID가 둘다 매치, 입력되는 값이 외부에서 입력되는 파라미터이므로 [[]] 더블 중괄호 사용
if [[ -n $1 ]] && [[ -n $2 ]]
then

  UserList=($1)
  Password=($2)

  # for문을 이용하여 여러개의 사용자 계정 생성 가능
  for (( i=0; i < ${#UserList[@]}; i++ ))
  do
    # if문을 사용하여 사용자 계정이 있는지 확인, grep 사용하여 사용자 중복 체크
    #결과값을 개수로 세어 개수가 0이면 사용자생성이 않됬다는 의미
    if [[ $(cat /etc/passwd | grep ${UserList[$i]} | wc -l) == 0 ]]
    then
      # 사용자 생성 및 패스워드 설정
      useradd ${UserList[$i]}
      echo ${Password[$i]} | passwd ${UserList[$i]} --stdin
    else
      # 사용자가 있다고 메시지를 보여줌.
      echo "this user ${UserList[$i]} is existing."
    fi
  done

else
  # 사용자 계정과 패스워드를 입력하라는 메시지를 보여줌.
  echo -e 'Please input user id and password.\nUsage: adduser-script.sh "user01 user02" "pw01 pw02"'
fi

 

차이

[team01@test1 ~]$ UserList=test
[team01@test1 ~]$ echo $UserList
test
[team01@test1 ~]$ echo UserList[@]
UserList[@]
[team01@test1 ~]$ echo ${#UserList[@]}  // 배열로 사용자 계정이 할당된 UserList의 길이만큼 사용자를 생성하기 위해 사용
1
[team01@test1 ~]$ echo ${UserList[@]}
test

 

test 라는 계정이 없으면 0 , team01이라는 계정이 있으면 1

[team01@test1 08.System]$ echo ${UserList[0]}
test
[team01@test1 08.System]$ cat /etc/passwd | grep ${UserList[0]} | wc -l
0
[team01@test1 08.System]$ UserList=team01
[team01@test1 08.System]$ echo ${UserList[0]}
team01
[team01@test1 08.System]$ cat /etc/passwd | grep ${UserList[0]} | wc -l
1

 

 

다른 서버에도 같은 계정을 생성할 때 쉘크립트 생성

SSH 사용해 다른 서버에 사용자 계정을 생성 

 

[team01@test1 08.System]$ cat '8.1 multisystem-adduser.sh'
#!/bin/bash

for server in "host01 host02 host03"
do
  # 여러대의 시스템에 사용자 생성 및 패스워드 설정
  echo $server
  ssh root@$server "useradd $1"
  ssh root@$server "echo $2 | passwd $1 --stdin"
done

결과

[root@test1 08.System]# sh mul.sh team02 team02
host01
root@host01's password:
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
root@host01's password:
Changing password for user team02.
passwd: all authentication tokens updated successfully.

 

 

 

 

 

 

 

###################################################################

 

 

ssh 공개키를 여러 서버에 복사 하는 스크립트

- ssh key 생성 명령어 : ssh-keygen

- ssh key 복사 명령어 : ssh-copy-id

- 접속할 서버 정보 : ip, 접속 계정 및 패스워드

 

프로세스

1) 접속할 서버 정보 및 ssh 키, 공개 키로 경로를 변수에 저장

2) ssh key 생성

3) 생성한 ssh 공개 키를 해당서버에 복사

 

 

스크립트

#sshpass 미리 설치하기

[root@test1 08.System]# cat '8.2 send-new-ssh-key.sh'
#!/bin/bash

# 접속할 서버 정보, SSH 키 경로, 공개키 경로를 변수에 저장
servers="host01 host02"
sshKey="$HOME/.ssh/key.pem"
sshPub="$HOME/.ssh/key.pem.pub"

# SSH Key 생성
ssh-keygen -q -N "" -f $sshKey

# 생성된 SSH Key를 해당 서버에 복사
for server in $servers
do
  echo $server
  sshpass -p "$1" ssh-copy-id -i $sshPub stack@$server
done

[root@test1 08.System]# sh send.sh team02
/root/.ssh/key123.pem already exists.
Overwrite (y/n)? y
host01
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/key123.pem.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh -p '22' 'team02@host01'"
and check to make sure that only the key(s) you wanted were added.

[root@test1 08.System]# cat send.sh
#!/bin/bash

# 접속할 서버 정보, SSH 키 경로, 공개키 경로를 변수에 저장
servers="host01 host02"
sshKey="$HOME/.ssh/key123.pem"
sshPub="$HOME/.ssh/key123.pem.pub"

# SSH Key 생성
ssh-keygen -q -N "" -f $sshKey

# 생성된 SSH Key를 해당 서버에 복사
for server in $servers
do
  echo $server
  sshpass -p "$1" ssh-copy-id -i $sshPub team02@$server -p 22
done

[team01@test1 08.System]$ ssh -i ~/.ssh/key.pem team02@host01 -p 22
Last login: Mon Aug  2 16:49:07 2021 from 1.1.1.1
[team02@master ~]$ exit

 

 

 

 

#################################################################

 

ntp 서버 설치 스크립트

 

- NTP 설치 명령어 : 페도라 계열 - yum install ntp

- NTP 설치 명령어 : 데비안 계열 - apt-get install ntp

- NTP 서버 정보, NTP 설치할 대상 서버 정보

 

프로세스

1) NTP 설치할 대상 서버 정보 변수 저장

2) 리눅스 페도라 계열인지 데비안 계열인지 확인

3) 페도라 계열이면 yum install ntp를 해당 서버에 설치

4) 데비안 계열이면 apt-get install ntp를 해당 서버에 설치

 

 

스크립트

[team01@test1 08.System]$ cat '8.3 install-ntp.sh'
#!/bin/bash

# NTP를 설치할 대상서버정보 저장
# 운영체제 타입 은 ID_LIKE로 확인, ID_LIKE는 fedora, debian로 구분, sed를 이용해 ID_LIKE를 공백으로 변경
# "fedora" 앞 쌍따옴표 제거
servers='host01 host02 host03'
cmd1='cat /etc/*release| grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g"'
cmd2=''

for server in $servers; do
  # 해당 서버의 운영체제 타입 확인
  # 쉘스크립트 명령어 결과를 저장하기 위해 $(명령어)로 해줌
  ostype=$(sshpass -p $1 ssh root@$server $cmd1)

  # 운영체제가 Fedora 계열인지 Debian 계열인지 체크
  if [[ $ostype == "fedora" ]]; then
    cmd2="yum install -y ntp"
  elif [[ $ostype == "debian" ]]; then
    cmd2="apt-get install -y ntp"
  fi

  # 해당 운영체제에 ntp 설치
  sshpass -p $1 ssh root@$server $cmd2
done

명령어 변수값

[team01@test1 08.System]$ cat /etc/os-release | grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g"
rhel fedora
[team01@test1 08.System]$ cat /etc/os-release | grep ID_LIKE
ID_LIKE="rhel fedora"

 

실행

[team01@test1 08.System]$ sh ntp.sh password
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirror.kakao.com
 * epel: nrt.edge.kernel.org
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Resolving Dependencies
--> Running transaction check
---> Package chrony.x86_64 0:3.4-1.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch              Version              Repository       Size
================================================================================
Installing:
 chrony            x86_64            3.4-1.el7            base            251 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 251 k
Installed size: 491 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : chrony-3.4-1.el7.x86_64                                      1/1
  Verifying  : chrony-3.4-1.el7.x86_64                                      1/1

Installed:
  chrony.x86_64 0:3.4-1.el7

Complete!
[team01@test1 08.System]$ ssh root@host01 -p 22
root@host01's password:
Last login: Mon Aug  2 17:48:16 2021 from 192.168.200.121
[root@master ~]# rpm -qa | grep chrony
chrony-3.4-1.el7.x86_64
[root@master ~]# exit
logout
Connection to host01 closed.

 

확인
[team01@test1 08.System]$ cat ntp.sh
#!/bin/bash

# NTP를 설치할 대상서버정보 저장
servers='host01'
cmd1='cat /etc/*release | grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g"'
cmd2=''

for server in $servers; do
  # 해당 서버의 운영체제 타입 확인
  ostype=$(sshpass -p $1 ssh root@$server -p 22 $cmd1)

  # 운영체제가 Fedora 계열인지 Debian 계열인지 체크
  if [[ $ostype == "rhel fedora" ]]; then
    cmd2="yum install -y chrony"
  elif [[ $ostype == "debian" ]]; then
    cmd2="apt-get install -y ntp"
  fi

  # 해당 운영체제에 ntp 설치
  sshpass -p $1 ssh root@$server -p 22 $cmd2
done

 

 

 

 

######################################################################################

timezone 설정 스크립트

 

 

- Timezone을 확인 : datetiemctl status

- Timezone 설정 : datetimectl set-timezone

 

프로세스

1) 파라미터로 입력받은 Timezone을 변수에 저장

2) 해당 서버의 Timezone을 확인하가ㅣ 위한 명령어 저장

3) for문을 돌리면서 해당 서버 Timezone 확인

4) 입력받은 Timezone과 해당 서버의 Timezone이 일치하는지 확인

5) 일치하지 않으면 입력받은 Timezone으로 해당 서버의 Timezone을 변경

 

 

스크립트 생성

[team01@test1 08.System]$ cat time.sh
#!/bin/bash

# Timezone을 설정할 대상정보 및 명령어 저장
servers="host01 host02 host03"
cmd1="timedatectl status | grep 'Time zone'"
cmd2="timedatectl set-timezone $1"

# timezone 또는 패스워드 둘 중 하나라도 입력하지 않았다면 스크립트 종료
if [[ -z $1 ]] || [[ -z $2 ]]; then
  echo -e 'Please input timezone and password\nUsage: sh set-timezone.sh Seoul/Asia password'
  exit;
fi

for server in $servers
do
  # 해당 서버의 설정된 timezone 정보 조회
  timezone=$(sshpass -p $2 ssh root@$server "$cmd1" | awk '{print $3}')
  echo "$server: $timezone"

  # 설정하고자 하는 timezone과 조회된 timezone이 다른지 확인
  if [[ $timezone != $1 ]]
  then
    # timezone이 서로 다르면 해당 서버에 입력받은 timezone으로 설정
    sshpass -p $2 ssh root@$server $cmd2
    echo "$server timezone changed to $1"
  fi
done

 

[root@master ~]# timedatectl
      Local time: Mon 2021-08-02 02:03:05 PDT
  Universal time: Mon 2021-08-02 09:03:05 UTC
        RTC time: Mon 2021-08-02 09:03:05
       Time zone: America/Los_Angeles (PDT, -0700)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2021-03-14 01:59:59 PST
                  Sun 2021-03-14 03:00:00 PDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2021-11-07 01:59:59 PDT
                  Sun 2021-11-07 01:00:00 PST

 

 

[team01@test1 08.System]$ sh time.sh Asia/Seoul password
host01: America/Los_Angeles
host01 timezone changed to Asia/Seoul
[team01@test1 08.System]$ ssh root@host01 -p 22
root@host01's password:
Last login: Mon Aug  2 18:01:58 2021 from 192.168.200.121
[root@master ~]# timedatectl status
      Local time: Mon 2021-08-02 18:05:53 KST
  Universal time: Mon 2021-08-02 09:05:53 UTC
        RTC time: Mon 2021-08-02 09:05:53
       Time zone: Asia/Seoul (KST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
[root@master ~]# exit
logout
Connection to host01 closed.
[team01@test1 08.System]$ cat time.sh
#!/bin/bash

# Timezone을 설정할 대상정보 및 명령어 저장
servers="host01"
cmd1="timedatectl status | grep 'Time zone'"
cmd2="timedatectl set-timezone $1"

# timezone 또는 패스워드 둘 중 하나라도 입력하지 않았다면 스크립트 종료
if [[ -z $1 ]] || [[ -z $1 ]]; then
  echo -e 'Please input timezone and password\nUsage: sh set-timezone.sh Seoul/Asia password'
  exit;
fi

for server in $servers
do
  # 해당 서버의 설정된 timezone 정보 조회
  timezone=$(sshpass -p $2 ssh root@$server -p 22 "$cmd1" | awk '{print $3}')
  echo "$server: $timezone"

  # 설정하고자 하는 timezone과 조회된 timezone이 다른지 확인
  if [[ $timezone != $1 ]]
  then
    # timezone이 서로 다르면 해당 서버에 입력받은 timezone으로 설정
    sshpass -p $2 ssh root@$server -p 22 $cmd2
    echo "$server timezone changed to $1"
  fi
done

타임존 리스트

[team01@test1 08.System]$ timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui

 

 

#######################################################################

 

패키시 리포지토리 다운로드 스크립트

 

- 패키지리포지토리 동기화 명령어 : reposync

- 디렉토리 리포지토리화하는 명령어 : createrepo

 

프로세스

1) 동기화 할 리포지토리는 외부로부터 입력받아 변수에 저장

2)리포지토리를 저장할 경로 저장

3) 운영체제 버전을 확인

4) 리포지토리를 동기화

5) 동기화 끝나면 리포지토리를 다운로드받은 경로를 createrepo를 통해 리포지토리화 함

 

 

스크립트 생성

 

[team01@test1 08.System]$ cat repo.sh
#!/bin/bash

# 레파지토지 목록을 입력받지 않고, 파일에 직접 입력해도 됨
repolist=$1
repopath=/var/www/html/repo/
osversion=$(cat /etc/redhat-release | awk '{print $(NF-1)}')

# 레파지토리 입력이 없으면 메시지를 보여주고 스크립트 종료
if [[ -z $1 ]]; then
  echo "Please input repository list. You can get repository from [yum repolist]"
  echo "Rhel7 Usage: reposync.sh \"rhel-7-server-rpms\""
  echo "Rhel8 Usage: reposync.sh \"rhel-8-for-x86_64-baseos-rpms\""
  exit;
fi

# 운영체제 버전에 따라 입력한 레포지토리만큼 동기화를 함.
for repo in $repolist; do
  # OS가 Rhel7일 경우
  if [ ${osversion:0:1} == 7 ]; then
    reposync --gpgcheck -l -n --repoid=$repo --download_path=$repopath
  # OS가 Rhel8일 경우
  elif [ ${osversion:0:1} == 8 ]; then
    reposync --download-metadata --repo=$repo -p $repopath
  fi
  # 해당 디렉토리를 레파지토리화한다.
  createrepo $repopath$repo
done

[team01@test1 08.System]$ cat /etc/redhat-release  | awk '{print $(NF)}'
8.3.2011

 

[team01@test1 08.System]$ echo $osversion
8.3.2011
[team01@test1 08.System]$ echo ${osversion:0:1}
8

[team01@test1 08.System]$ echo ${osversion:0:3}
8.3

 

 

다른 것

[team01@test1 08.System]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

[team01@test1 08.System]$ cat /etc/os-release | grep VERSION=
VERSION="8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

[team01@test1 08.System]$ cat /etc/os-release | grep VERSION=  | head -n 1
VERSION="8"

[team01@test1 08.System]$ cat /etc/os-release | grep VERSION=  | head -n 1 | sed "s/VERSION=//;s/\"//g"
8

 

[root@test1 ~]# mkdir -p /var/www/html/repo

[team01@test1 08.System]$ sudo yum -y install createrepo yum-utils httpd

 

 

[team01@test1 08.System]$ sudo sh repo.sh baseos
CentOS Linux 8 - BaseOS                                                                 7.5 kB/s | 3.9 kB     00:00
CentOS Linux 8 - BaseOS                                                                 8.5 MB/s | 9.6 MB     00:01
(1/1911): ModemManager-glib-1.10.8-2.el8.x86_64.rpm                                     2.5 MB/s | 263 kB     00:00
(2/1911): ModemManager-glib-1.10.8-2.el8.i686.rpm                                       2.0 MB/s | 269 kB     00:00
(3/1911): ModemManager-1.10.8-2.el8.x86_64.rpm                                          4.4 MB/s | 923 kB     00:00
(4/1911): NetworkManager-adsl-1.30.0-7.el8.x86_64.rpm                                   1.8 MB/s | 141 kB     00:00
(5/1911): NetworkManager-adsl-1.30.0-9.el8_4.x86_64.rpm                                 1.4 MB/s | 141 kB     00:00
(6/1911): NetworkManager-1.30.0-7.el8.x86_64.rpm                                        6.4 MB/s | 2.6 MB     00:00
(7/1911): NetworkManager-bluetooth-1.30.0-7.el8.x86_64.rpm                              1.2 MB/s | 167 kB     00:00

....

(1909/1911): zlib-devel-1.2.11-17.el8.i686.rpm                                          1.4 MB/s |  58 kB     00:00
(1910/1911): zlib-devel-1.2.11-17.el8.x86_64.rpm                                        1.2 MB/s |  58 kB     00:00
(1911/1911): zsh-5.5.1-6.el8_1.2.x86_64.rpm                                             8.4 MB/s | 2.9 MB     00:00
Directory walk started
Directory walk done - 1911 packages
Temporary output repo path: /var/www/html/repo/baseos/.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished

 

 

 

###################################################################################

오픈스택 인스턴스 생성 스크립트

 

- 이미지 조회 명령어 : openstack image list

- 네트워크 조회 명령어 : openstack network list

- flavor 조회 명령어 : openstack flavor list

- 보안그룹 조회 명령어 : openstack security group list

- ssh 키 조회 명령어 : openstack keypair list

- 인스턴스 생성 명령어 : openstack server create

 

프로세스

1) 인스턴스 명 입력

2) 이미지 정보를 보여주고 생성하고자 하는 이미지명 입력

3) 네트워크 정보를 보여주고 네트워크 명 입력

4) flavor 정보를 보여주고 flavor 명 입력

5) 보안그룹 정보를 보여주고 보안그룹명 입력

6) ssh 키 정보를 보여주고 ssh 키 입력

7) 앞에서 입력받은 데이터를 이용하여 인스턴스 생성

 

 

[team01@test1 08.System]$ cat in.sh
#!/bin/bash

# 인스턴스명 입력
#read 명령어로 instance 이름 입력받음
read -p "Input instance name : " vmname

# 이미지 정보
#-c 옵션을 이용해 특정 컬럼 정보만 조회, -c Name은 컬럼만 출력
#-f value옵션은 출력시 헤더값 제외하고 결과값만 출력
#모두 Name 컬럼의 조회된 결과값만 출력
echo "== Image List =="
openstack image list -c Name | awk 'FNR==3, FNR==(NR-1) { print $2 }' | grep -v '^$'
read -p  "Input image name : " image

# 네트워크 정보
echo "== Network List =="
openstack network list -c Name | awk 'FNR==3, FNR==(NR-1) { print $2 }' | grep -v '^$'
read -p "Input network name : " net

# Flaver 정보
echo "== Flavor List =="
openstack flavor list -c Name | awk 'FNR==3, FNR==(NR-1) { print $2 }' | grep -v '^$'
read -p "Input flavor name : " flavor

# 보안그룹 정보
#오픈스택 보안그룹 목록 조회, 조회된 목록에서 특정 프로젝트만 필터링
#grep과 awk로 이용해 보안그룹 UUID값만 추출
echo "== Security group List =="
openstack security group list --project $OS_PROJECT_NAME -c Name | awk 'FNR==3, FNR==(NR-1) { print $2 }' | grep -v '^$'
read -p "Input security group name : " sec
secgrp=$(openstack security group list --project $OS_PROJECT_NAME -f value -c ID -c Name | grep 'default$' | awk '{print $1}')

# SSH 키 정보
echo "== Keypair List =="
openstack keypair list -c Name | awk 'FNR==3, FNR==(NR-1) { print $2 }' | grep -v '^$'
read -p "Input keypair name : " keypair

# 볼륨 생성
echo "== Create volume =="
read -p "Input volume size: " size
openstack volume create --size $size --image $image --bootable $vmname

# 인스턴스 생성
echo "Create Instance Starting"
openstack server create \
--volume $(openstack volume list --name $vmname -f value -c ID) \
--flavor $flavor \
--security-group $secgrp \
--key-name $keypair \
--network $net \
--wait \
$vmname

 

실행 

 

#sh create-instance.sh

 

 

Input instance name : test

 

Input image name : cirros-0.5.1

 

Input network name : demo_net

 

Input flavor name : tiny

 

Input security group name : default

 

Input keypair name : demo_key

 

Input volume size: 10

 

생성됨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'shell_script' 카테고리의 다른 글

shell - 패스워드 생성 법칙 적용  (0) 2021.08.11
shell - 환경변수 설정  (0) 2021.08.07
shell 기본 sed  (0) 2021.07.30
shell 기본 awk  (0) 2021.07.29
shell 기본 find  (0) 2021.07.29