계정 생성 쉘 스크립트
필요 내용
- 사용자 계정 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 |