ssh 환경변수 설정
필요정보
- ssh 환경 설정 파일 경로 : /etc/ssh/sshd_config
- 많이 사용하는 환경 설정 항목
a) Port: : SSH 기본 포트인 22번 포트를 다른 포트번호로 변경할 떄 사용
b) PermitRootLogin: : root 계정으로 ssh 접근 허용할 지 여부
c) PasswordAuthentication: : 패스워드를 이용한 인증을 허용할지에 대한 여부
d) PubkeyAuthentication: : 퍼블릭키를 이용한 인증을 허용할지에 대한 여부
#port 22 기본 주석처리
[root@shell ~]# cat /etc/ssh/sshd_config | grep 'Port'
#Port 22
#GatewayPorts no
#root계정 포트 주석처리, 디폴트로 접근 불가
[root@shell ~]#
[root@shell ~]# cat /etc/ssh/sshd_config | grep 'PermitRootLogin'
#PermitRootLogin yes
# the setting of "PermitRootLogin without-password".
#ssh 접근 시 패스워드 접근 허용 여부
[root@shell ~]# cat /etc/ssh/sshd_config | grep 'PasswordAuthentication'
#PasswordAuthentication yes
PasswordAuthentication yes
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication
#ssh 접근시 ssh키 통해 접근 허용 여부
[root@shell ~]# cat /etc/ssh/sshd_config | grep 'PubkeyAuthentication'
#PubkeyAuthentication yes
프로세스
- ghksrud tjfwjd vkdlf rudfhfmf qustndp wjwkd
- Switch~case문 이용하여 해당 번호로 입력 받으면 환경 설정 진행
- 해당 경로에서 해당 항목을 찾아 sed 이용하여 값을 변경하고 파일 적용
- 설정 변경이 되었으면 ssh 서비스를 재시작
- 운영체제가 레드햇 리눅스이고, 포트를 변경했으면 selinux설정 변경
[team01@shell 09. Configuration]$ cat conf-sshd.sh
#!/bin/bash
conf_path=/etc/ssh/sshd_config
function restart_system()
{
echo "Restart sshd"
systemctl restart sshd
}
function selinux()
{
# 운영체제가 레드햇 리눅스이고, port를 수정했을 경우
if [[ $(cat /etc/*release | grep -i redhat | wc -l) > 1 ]] && [[ $1 == 1 ]]
then
# SELinux에 해당 port 추가
echo "Add port $port to selinux"
semanage port -a -t ssh_port_t -p tcp $port
fi
}
# 환경설정 파일 백업
cp $conf_path ${conf_path}.bak.$(date +%Y%m%d)
case $1 in
1)
# Port 변경
read -p "Please input port: " port
exist_conf=$(cat $conf_path | grep -e '^#Port' -e '^Port')
# #port 22를 다른 port $port 로 변경, -i 옵션은 직접 파일에 수정
sed -i "s/$exist_conf/Port $port/g" $conf_path
restart_system
selinux $1
;;
2)
# PermitRootLogin 변경
read -p "Please input PermitRootLogin yes or no: " rootyn
exist_conf=$(cat $conf_path | grep -e '^#PermitRootLogin' -e '^PermitRootLogin')
sed -i "s/$exist_conf/PermitRootLogin $rootyn/g" $conf_path
restart_system
;;
3)
# PasswordAuthentication 변경
read -p "Please input PasswordAuthentication yes or no: " pwyn
exist_conf=$(cat $conf_path | grep -e '^#PasswordAuthentication' -e '^PasswordAuthentication')
sed -i "s/$exist_conf/PasswordAuthentication $pwyn/g" $conf_path
restart_system
;;
4)
# PubkeyAuthentication 변경
read -p "Please input PubkeyAuthentication yes or no: " keyyn
exist_conf=$(cat $conf_path | grep -e '^#PubkeyAuthentication' -e '^PubkeyAuthentication')
sed -i "s/$exist_conf/PubkeyAuthentication $keyyn/g" $conf_path
restart_system
;;
*)
echo "Please input with following number"
echo "1) Port 2) PermitRootLogin 3) PasswordAuthentication 4)PubkeyAuthentication"
echo "Usage: config-sshd.sh 2"
esac
[root@shell ~]# semanage
-bash: semanage: command not found
설치
[root@shell ~]# yum provides /usr/sbin/semanage
[root@shell ~]# yum -y install policycoreutils-python
redhat 갯수
[root@shell ~]# cat /etc/os-release | grep -i redhat | wc -l
2
[root@shell ~]# cat /etc/os-release | grep -i redhat
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
포트 확인
[root@shell ~]# semanage port -l | grep ssh_port_t
ssh_port_t tcp 22
[root@shell ~]# cat /etc/ssh/sshd_config | grep -e '^#Port' -e '^Port'
#Port 22
결과
[root@shell 09. Configuration]# cat conf-sshd.sh
#!/bin/bash
conf_path=/etc/ssh/sshd_config
function restart_system()
{
echo "Restart sshd"
systemctl restart sshd
}
function selinux()
{
# 운영체제가 레드햇 리눅스이고, port를 수정했을 경우
if [[ $(cat /etc/*release | grep -i redhat | wc -l) > 1 ]] && [[ $1 == 1 ]]
then
# SELinux에 해당 port 추가
echo "Add port $port to selinux"
semanage port -a -t ssh_port_t -p tcp $port
fi
}
# 환경설정 파일 백업
cp $conf_path ${conf_path}.bak.$(date +%Y%m%d)
case $1 in
1)
# Port 변경
read -p "Please input port: " port
exist_conf=$(cat $conf_path | grep -e '^#Port' -e '^Port')
sed -i "s/$exist_conf/Port $port/g" $conf_path
restart_system
selinux $1
;;
2)
# PermitRootLogin 변경
read -p "Please input PermitRootLogin yes or no: " rootyn
exist_conf=$(cat $conf_path | grep -e '^#PermitRootLogin' -e '^PermitRootLogin')
sed -i "s/$exist_conf/PermitRootLogin $rootyn/g" $conf_path
restart_system
;;
3)
# PasswordAuthentication 변경
read -p "Please input PasswordAuthentication yes or no: " pwyn
#아래 수정
exist_conf=$(cat $conf_path | grep -e '^PasswordAuthentication')
echo $exist_conf
echo $pwyn
sed -i "s/$exist_conf/PasswordAuthentication $pwyn/g" $conf_path
restart_system
;;
4)
# PubkeyAuthentication 변경
read -p "Please input PubkeyAuthentication yes or no: " keyyn
exist_conf=$(cat $conf_path | grep -e '^#PubkeyAuthentication' -e '^PubkeyAuthentication')
sed -i "s/$exist_conf/PubkeyAuthentication $keyyn/g" $conf_path
restart_system
;;
*)
echo "Please input with following number"
echo "1) Port 2) PermitRootLogin 3) PasswordAuthentication 4)PubkeyAuthentication"
echo "Usage: config-sshd.sh 2"
esac
[root@shell 09. Configuration]# sh conf-sshd.sh 1
Please input port: 22
Restart sshd
Add port 22 to selinux
ValueError: Port tcp/22 already defined
[root@shell 09. Configuration]# sh conf-sshd.sh 2
Please input PermitRootLogin yes or no: yes
Restart sshd
[root@shell 09. Configuration]# sh conf-sshd.sh 3
Please input PasswordAuthentication yes or no: yes
PasswordAuthentication no
yes
Restart sshd
[root@shell 09. Configuration]# sh conf-sshd.sh 4
Please input PubkeyAuthentication yes or no: no
Restart sshd
[root@shell 09. Configuration]#
[root@shell 09. Configuration]#
[root@shell 09. Configuration]# cat /etc/ssh/sshd_config | grep -e 'Port' -e '^Permit' -e 'Password' -e '^Pubkey'
Port 22
PermitRootLogin yes
PubkeyAuthentication no
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication, then enable this but set PasswordAuthentication
#GatewayPorts no
이슈처리
아래처럼 결과가 바로 옆에 붙어서 나옴
[root@shell 09. Configuration]# sh conf-sshd.sh 3
Please input PasswordAuthentication yes or no: no
#PasswordAuthentication yes PasswordAuthentication yes
no
sed: -e expression #1, char 29: unterminated `s' command //에러 난 곳
Restart sshd
수정
[root@shell 09. Configuration]# cat conf-sshd.sh
#아래처럼 수정
exist_conf=$(cat $conf_path | grep -e '^PasswordAuthentication')
//정상처리
[root@shell 09. Configuration]# sh conf-sshd.sh 3
Please input PasswordAuthentication yes or no: no
Restart sshd
#########################################################################
ntp 서버 환경설정
- chrony 경우 환경 설정 파일 경로 : /etc/chrony.conf
- NTP일 경우 환경 설정 파일 경로 : /etc/ntp.conf
- 설정될 환경 설정 항목
a) ntp server pool: : ntp.conf와 chrony.conf에서 동일하게 사용되는 ntp서버 목록
b) allow: : ntp를 접근할 수 있는 네트워크 대역을 제한할때 사용하며, chrony.conf에서 쓰임
c) restrict: : ntp를 접근할 수 있는 네트워크 대역을 제한할때 사용하며, ntp.conf에서 사용됨
프로세스
1) 파라미터로 ip 대역을 입력받아 정규 표현식에 의해 ip 대역인지 확인
2) 잘못 입력했다면 메세지 출력
3) 설치된 ntp패키지 정보 확인
4) 기본으로 설정되어 있는 ntp 서버 풀을 주석 처리
5) 주석처리된 서버 풀 아래에 로컬 서버 정보를 서버 풀로 추가
6) IP 대역을 확인 후 있으면 allow 나 restrict로 설정
7) ntp 서비스를 재시작
8) firewall에 ntp포트를 추가
[team01@shell 09. Configuration]$ cat ntp.sh
#!/bin/bash
ip=""
netmask=""
conf=""
service=""
# IP CIDR을 NetMask로 변경함.
function transfer_iprange()
{
ip=${1%/*} #매개변수 확장자%를 사용하여 /로 시작하는 문자 뒷부분 삭제,1.1.1.1/24 -> 1.1.1.1로변경
#매개변수 확장자 #을 사용하여 /로 앞부분의 문자열을 모두 삭제, 1.1.1.1/24 -> 24만 남음
if [[ ${1#*/} == 16 ]]; then netmask="255.255.0.0"; fi
if [[ ${1#*/} == 23 ]]; then netmask="255.255.254.0"; fi
if [[ ${1#*/} == 24 ]]; then netmask="255.255.255.0"; fi
if [[ ${1#*/} == 28 ]]; then netmask="255.255.240.0"; fi
}
if [[ -n $1 ]]; then
# 정규 표현식을 이용하여 IP 범위를 정상적으로 입력했는지 확인
#{1,3}1이상 3이하, [0-9]{2}$는 2자리 숫자로 끝나는 문자열, wc-l은 라인 갯수
range_chk=$(echo "$1" | grep -E "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.0/[0-9]{2}$" | wc -l)
# 정규 표현식과 다르다면 메시지를 출력하고 스크립트 종료
if [[ range_chk -eq 0 ]]; then
echo "This ip cidr is wrong. Please input the right ip cidr."
exit;
fi
fi
# chrony가 설치되어 있는지 ntp가 설치되어 있는지 환경설정 파일을 통해 확인
if [[ -f /etc/chrony.conf ]]; then
conf=/etc/chrony.conf
service=chronyd.service
elif [[ -f /etc/ntp.conf ]]; then
conf=/etc/ntp.conf
service=ntpd.service
fi
# 서버 주소 변경
sed -i "s/^server/#server/g" $conf
#'#server 3'으로 시작하는 문자열, 그 문자열 뒤에 server 127.127.1.0 추가
sed -i "/^#server 3/ a \server 127.127.1.0" $conf
# 파라메터로 IP가 있으면 allow 설정
if [[ -n $1 && -f /etc/chrony.conf ]]; then
sed -i "/^#allow/ a \allow $1" $conf
# 환경설정 파일이 ntp.conf 일 경우
elif [[ -n $1 && -f /etc/ntp.conf ]]; then
transfer_iprange $1
restrict="restrict $ip mask $netmask nomodify notrap"
sed -i "/^#restrict/ a \restrict $restrict" $conf
fi
# 서비스 재시작
echo "systemctl restart $service"
systemctl restart $service
# 포트 추가
echo "firewall-cmd --add-service=ntp"
firewall-cmd --add-service=ntp
echo "firewall-cmd --add-service=ntp --permanent"
firewall-cmd --add-service=ntp --permanent
결과
[root@shell 09. Configuration]# cat ntp.sh
#!/bin/bash
ip=""
netmask=""
conf=""
service=""
# IP CIDR을 NetMask로 변경함.
function transfer_iprange()
{
ip=${1%/*}
if [[ ${1#*/} == 16 ]]; then netmask="255.255.0.0"; fi
if [[ ${1#*/} == 23 ]]; then netmask="255.255.254.0"; fi
if [[ ${1#*/} == 24 ]]; then netmask="255.255.255.0"; fi
if [[ ${1#*/} == 28 ]]; then netmask="255.255.240.0"; fi
}
if [[ -n $1 ]]; then
# 정규 표현식을 이용하여 IP 범위를 정상적으로 입력했는지 확인
range_chk=$(echo "$1" | grep -E "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.0/[0-9]{2}$" | wc -l)
# 정규 표현식과 다르다면 메시지를 출력하고 스크립트 종료
if [[ range_chk -eq 0 ]]; then
echo "This ip cidr is wrong. Please input the right ip cidr."
exit;
fi
fi
# chrony가 설치되어 있는지 ntp가 설치되어 있는지 환경설정 파일을 통해 확인
if [[ -f /etc/chrony.conf ]]; then
conf=/etc/chrony.conf
service=chronyd.service
elif [[ -f /etc/ntp.conf ]]; then
conf=/etc/ntp.conf
service=ntpd.service
fi
# 서버 주소 변경
sed -i "s/^server/#server/g" $conf
sed -i "/^#server 3/ a \server 127.127.1.0" $conf
# 파라메터로 IP가 있으면 allow 설정
if [[ -n $1 && -f /etc/chrony.conf ]]; then
sed -i "/^#allow/ a \allow $1" $conf
# 환경설정 파일이 ntp.conf 일 경우
elif [[ -n $1 && -f /etc/ntp.conf ]]; then
transfer_iprange $1
restrict="restrict $ip mask $netmask nomodify notrap"
sed -i "/^#restrict/ a \restrict $restrict" $conf
fi
# 서비스 재시작
echo "systemctl restart $service"
systemctl restart $service
# 포트 추가
echo "firewall-cmd --add-service=ntp"
firewall-cmd --add-service=ntp
echo "firewall-cmd --add-service=ntp --permanent"
firewall-cmd --add-service=ntp --permanent
[root@shell 09. Configuration]# sh ntp.sh 192.168.100.0/24
systemctl restart chronyd.service
firewall-cmd --add-service=ntp
Warning: ALREADY_ENABLED: 'ntp' already in 'public'
success
firewall-cmd --add-service=ntp --permanent
success
[root@shell 09. Configuration]# cat /etc/chrony.conf | grep -e server -e allow
# Use public servers from the pool.ntp.org project.
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
server 127.127.1.0
#server 127.127.1.0
#server 127.127.1.0
#allow 192.168.0.0/16
allow 192.168.100.0/24
allow 192.168.100.0/24
allow 192.168.100.0/24
############################################################################
lvm 환경 설정
- 필요에 따라서 볼륨을 할당
-호스트에 설치된 운영체제와 VM이 VM에 설치된 운영체제 모두 lvm이 설정되어 있는 경우 호스트의 lvm서비스가 VM의 lvm서비스에 사용하는 디바이스까지 모두 스캔하여, VM의 lvm서비스가 정상적으로 동작하지 않을 경우가 발생, 이럴때 호스트의 lvm환경 설정을 통해 이를 해결
필요정보
- lvm 환경 설정파일 경로 : /etc/lvm/lvm.conf
- 설정될 환경 설정 항목 : global_filter
프로세스
1) lvm환경설정을 변경할 호스트 노드 목록을 변수에 저장
2) for문을 돌면서 다음 프로세스를 처리
a) grep을 이용해 lvm.conf에서 global_filter가 주석처리되어 있는지 확인
b) 설정을 변경하기 전에 백업을 받음
c) 주석처리되어 있다면 sed를 이용해 설정을 변경
d) 설정이 변경되었으면 lvm관련 서비스들을 재시작
[root@test1 09. Configuration]# cat lvm.sh
#!/bin/bash
# 설정 변경 대상 노드들
nodes="host01 host02 host03"
# 환경설정 확인 명령어
cmd1="cat /etc/lvm/lvm.conf | grep -e '^[[:space:]]*global_filter =' | wc -l"
# 환경설정 파일 백업 명령어
cmd2="cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak"
# 환경설정 변경 명령어
#해당 호스트의 /etc/lvm/lvm.conf 파일의 # global_filter로 시작하는 라인의 다음 줄 (\1\n)에
# global_filter=[""r|.*|""]로 내용 대체, 더블 쌍따옴표 기호를 넣은 건 문자열에서 쌍따옴표를 표현
cmd3="sed -i 's/\(# global_filter =.*\)/\1\n global_filter = [ ""r|.*|"" ]/g' /etc/lvm/lvm.conf"
# lvm관련 서비스 재시작 명령어
cmd4="systemctl restart lvm2*"
#stty -echo는 패스워드 입력시 외부 노출 방지 read 명령어그대로 사용하면 외부 노출됨,
#이때 read 명령어 앞뒤에 stty -echo를 해주면 패스워드 유출 방지할 수 있으
stty -echo
read -p "Please input Hosts password: " pw
stty echo
#if [[ -z $pw ]]는 사용자가 패스워들르 입력하지 않았을 경우 echo에 있는 메시지를 주며, 스크립트 중단함
if [[ -z $pw ]]; then echo -e "\nYou need a password for this script. Please retry script"; exit; fi
for node in $nodes
do
echo -e "\n$node"
conf_chk=$(sshpass -p $pw ssh root@$node $cmd1)
if [[ conf_chk -eq 0 ]]; then
# 설정 변경 전 백업.
echo "lvm.conf backup"
sshpass -p $pw ssh root@$node $cmd2
# sed를 이용해 설정을 변경함.
echo "lvm.conf reconfiguration"
sshpass -p $pw ssh root@$node $cmd3
# lvm 관련 서비스 재시작
echo "lvm related service restart"
sshpass -p $pw ssh root@$node $cmd4
fi
done
결과
[root@test1 09. Configuration]# cat lvm.sh
#!/bin/bash
# 설정 변경 대상 노드들
nodes="host01"
# 환경설정 확인 명령어
cmd1="cat /etc/lvm/lvm.conf | grep -e '^[[:space:]]*global_filter =' | wc -l"
# 환경설정 파일 백업 명령어
cmd2="cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak"
# 환경설정 변경 명령어
cmd3="sed -i 's/\(# global_filter =.*\)/\1\n global_filter = [ ""r|.*|"" ]/g' /etc/lvm/lvm.conf"
# lvm관련 서비스 재시작 명령어
cmd4="systemctl restart lvm2*"
#패스워드 입력업싱 수행할 메세지를 보여주고 스크립트 종료
cmd5="cat /etc/lvm/lvm.conf | grep -e '^[[:space::]]*global_filter ='"
stty -echo
read -p "Please input Hosts password: " pw
stty echo
if [[ -z $pw ]]; then echo -e "\nYou need a password for this script. Please retry script"; exit; fi
for node in $nodes
do
echo -e "\n$node"
conf_chk=$(sshpass -p $pw ssh root@$node -p 22 $cmd1)
if [[ conf_chk -eq 0 ]]; then
# 설정 변경 전 백업.
echo "lvm.conf backup"
sshpass -p $pw ssh root@$node -p 22 $cmd2
# sed를 이용해 설정을 변경함.
echo "lvm.conf reconfiguration"
sshpass -p $pw ssh root@$node -p 22 $cmd3
# lvm 관련 서비스 재시작
echo "lvm related service restart"
sshpass -p $pw ssh root@$node -p 22 $cmd4
echo "no input password and process lvm"
sshpass -p $pw ssh root@$node -p 22 $cmd5
fi
done
[root@test1 09. Configuration]# sh lvm.sh
Please input Hosts password:
host01
lvm.conf backup
lvm.conf reconfiguration
lvm related service restart
[root@test1 09. Configuration]#
lvm restart 명령어 수행
[root@test1 09. Configuration]# for node in "host01"; do sshpass -p 'redhat' ssh root@$node -p 22 "systemctl restart lvm*"; done
[root@test1 09. Configuration]#
###############################################################################
nfs 스토리지 마운트 스크립트
필요정보
- 마운트 명령어 : mount
- 마운트할 대상 NFS 서버 경로
- 마운트할 디렉토리
- 마운트할 NFS 버전 및 옵션
프로세스
- 마운트할 대상 NFS서버 경로를 변수에 저장
- 마운트할 디렉토리명을 변수에 저장
-마운트할 디렉토리가 있는지 체크 후 디렉토리를 생성
- 생성할 디렉토리에 마운트 대상 NFS를 기본 옵션으로 마운트
- 마운트가 되면 mount 명령어를 이용하여 마운트된 디렉토리의 NFS정보를 확인
- /etc/fstab에 해당 정보를 추가
- /etc/fstab을 열어 추가된 정보를 확인
[root@shell 09. Configuration]# cat conf-nfs.sh
#!/bin/bash
# 변수에 마운트 대상 NFS 경로 및 디렉토리 저장
nfs_server="nfs.host01:/temp"
nfs_dir=/nfs_temp
# 마운트할 디렉토리가 있는지 체크후 없으면 디렉토리 생성
if [ ! -d $nfs_dir ]; then mkdir -p $nfs_dir; fi
# 해당 NFS와 디렉토리 마운트
mount -t nfs $nfs_server $nfs_dir
# 마운트 정보에서 마운트 타입과 옵션 추출
nfs_type=$(mount | grep $nfs_dir | awk '{print $5}')
nfs_opt=$(mount | grep $nfs_dir | awk '{print $6}' | awk -F ',' '{print $1","$2","$3}')
# 추출한 마운트 정보를 조합하여 /etc/fstab에 설정
echo "$nfs_server $nfs_dir $nfs_type ${nfs_opt:1} 1 1" >> /etc/fstab
# 설정한 /etc/fstab 내용 확인
cat /etc/fstab | grep $nfs_dir
# 마운트 된 디렉토리 정보 확인
df -h | grep $nfs_dir
<nfs server set>
[root@shell 09. Configuration]# yum -y install nfs-utils*
[root@shell 09. Configuration]# systemctl start nfs-server
[root@shell 09. Configuration]# systemctl enable nfs-server
[root@shell 09. Configuration]# systemctl status rpcbind
[root@shell 09. Configuration]# vi /etc/exports
/test 192.168.100.*(rw,sync)
[root@shell 09. Configuration]# exportfs -v
[root@shell 09. Configuration]# exportfs -r
[root@shell 09. Configuration]# exportfs -v
/test 192.168.100.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@shell 09. Configuration]# firewall-cmd --permanent --add-service=nfs
success
[root@shell 09. Configuration]# firewall-cmd --permanent --add-service=rpc-bind
success
[root@shell 09. Configuration]# firewall-cmd --permanent --add-service=mountd
success
[root@shell 09. Configuration]# firewall-cmd --reload
success
[root@shell 09. Configuration]# systemctl restart firewalld
<nfs client>
[root@test1 09. Configuration]# cat nfs.sh
#!/bin/bash
# 변수에 마운트 대상 NFS 경로 및 디렉토리 저장
nfs_server="host02:/test"
nfs_dir=/nfs_test
# 마운트할 디렉토리가 있는지 체크후 없으면 디렉토리 생성
#-d $nfs_dir만 사용할때 nfs_dir에 저장된 디렉토리가존재하면 true 없으면 디렉토리 생성
if [ ! -d $nfs_dir ]; then mkdir -p $nfs_dir; fi
# 해당 NFS와 디렉토리 마운트
mount -t nfs $nfs_server $nfs_dir
# 마운트 정보에서 마운트 타입과 옵션 추출
nfs_type=$(mount | grep $nfs_dir | awk '{print $5}')
#마운트 구분 기호',' 쉼표로
nfs_opt=$(mount | grep $nfs_dir | awk '{print $6}' | awk -F ',' '{print $1","$2","$3}')
# 추출한 마운트 정보를 조합하여 /etc/fstab에 설정
echo "$nfs_server $nfs_dir $nfs_type ${nfs_opt:1} 1 1" >> /etc/fstab
# 설정한 /etc/fstab 내용 확인
cat /etc/fstab | grep $nfs_dir
# 마운트 된 디렉토리 정보 확인
df -h | grep $nfs_dir
결과
nfs 확인
[root@test1 09. Configuration]# showmount -e 192.168.100.128
Export list for 192.168.100.128:
/test 192.168.100.*
nfs 스크립트 실행
[root@test1 09. Configuration]# sh nfs.sh
nfs.host02:/test /nfs_test 1 1
host02:/test /nfs_test nfs4 rw,relatime,vers=4.2 1 1
host02:/test 14G 1.4G 13G 10% /nfs_test
파일및 디렉토리 확인
[root@test1 09. Configuration]# ls -l /nfs_test/
total 4
-rw-r--r--. 1 root root 5 Aug 7 23:14 test.txt
파일시스템 등록 확인
[root@test1 09. Configuration]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Wed Dec 30 03:26:25 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=65ad7735-bf61-46aa-b250-cbc012fa0608 /boot ext4 defaults 1 2
UUID=4CAA-1C6E /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/cl-swap swap swap defaults 0 0
nfs.host02:/test /nfs_test 1 1
host02:/test /nfs_test nfs4 rw,relatime,vers=4.2 1 1
[root@test1 09. Configuration]# mount | grep /nfs_test
host02:/test on /nfs_test type nfs4 (rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.100.101,local_lock=none,addr=192.168.100.128)
[root@test1 09. Configuration]# mount | grep /nfs_test | awk '{print $5}'
nfs4
[root@test1 09. Configuration]# mount | grep /nfs_test | awk '{print $6}' | awk -F ',' '{print $1","$2","$3}'
(rw,relatime,vers=4.2
###############################################################################
네트워크 IP 설정 스크립트
필요정보
- 데비안 계열에서 네트워크 설정 : 18.04lts버전부터 netplan파일 설정으로 변경
- 페도라 계열에서 네트워크 설정 : 8버전부터 nmcli 명령어 이용하여 설정
- 네트워크 ip 설정 시 필요한 정보 : network interface name, IP/CIDR, Gateway, DNS
프로세스
- 운영체제 타입을 확인 후 변수 저장
- 네트워크 디바이스 명을 조회하여 보여줌
- 네트워크 IP설정에 필요한 정보를 사용자로부터 입력
- 네트워크 정보를 입력받지 않았을 경우 입력하라는 메세지 출력 후 스크립트 종료
- 운영체제 타입이 페도라일 경우 nmcli를 이용해 네트워크 IP 설정
- 운영체제 타입이 데비안일 경우 netplan 파일을 생성하여 네트워크 IP 설정
[root@shell 09. Configuration]# cat netip.sh
#!/bin/bash
# 운영체제 타입 확인
ostype=$(cat /etc/*release| grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g")
# 네트워크 정보를 사용자로부터 입력 받음
echo "=== Network Devices ==="
#ip a를 통해 grep을 이용해서 숫자로 시작하는 라인만 검색 후 1번쨰와 2번쨰 인덱스의 값 추출
# 또 grep을 이용하여 로컬호스트인 lo와 가상네트워크인 v로 시작하는 네트워크와
# 컨테이너에서 사용하는 t로 시작하는 네트워크를 제외하면 실제 사용 네트워크 조회
ip a | grep '^[0-9]' | awk '{print $1" "$2}' | grep -v -e 'lo' -e 'v' -e 't'
read -p "Please input network interface: " net_name
read -p "Please input network ip(ex:192.168.122.10/24): " net_ip
read -p "Please input network gateway: " net_gw
read -p "Please input network dns: " net_dns
# 하나라도 입력하지 않았을 경우 입력하라는 메시지 출력후 스크립트 종료
if [[ -z $net_name ]] || [[ -z $net_ip ]] || [[ -z $net_gw ]] || [[ -z $net_dns ]]; then
echo "You need to input network information. Please retry this script"
exit;
fi
# 운영체제가 페도라 계열일 경우 nmcli 명령어를 이용하여 네트워크 IP 설정
if [[ $ostype == "fedora" ]]; then
nmcli con add con-name $net_name type ethernet ifname $net_name ipv4.address $net_ip ipv4.gateway $net_gw ipv4.dns $net_dns ipv4.method manual
nmcli con up $net_name
# 운영체제가 데미안 계열일 경우 netplan에 yaml 파일을 생성하여 네트워크 IP 설정
elif [[ $ostype == "debian" ]]; then
ip_chk=$(grep $net_name /etc/netplan/*.yaml|wc -l)
# 설정하고자 하는 IP로 설정파일이 없을 경우 관련 네트워크 yaml 파일 생성
if [ $ip_chk -eq 0 ]; then
#EOF가 나올때까지의 내용을 .yaml에 저장
cat > /etc/netplan/${net_name}.yaml << EOF
network:
version: 2
renderer: networkd
ethernets:
$net_name:
dhcp4: no
dhcp6: no
addresses: [$net_ip]
gateway4: $net_gw
nameservers:
addresses: [$net_dns]
EOF
echo "cat /etc/netplan/${net_name}.yaml"
cat /etc/netplan/${net_name}.yaml
echo "apply netplan"
netplan apply
else
echo "This $net_name is configured already."
fi
fi
결과
[team01@shell 09. Configuration]$ cat netip.sh
#!/bin/bash
# 운영체제 타입 확인
ostype=$(cat /etc/*release| grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g")
# 네트워크 정보를 사용자로부터 입력 받음
echo "=== Network Devices ==="
ip a | grep '^[0-9]' | awk '{print $1" "$2}' | grep -v -e 'lo' -e 'v' -e 't'
read -p "Please input network interface: " net_name
read -p "Please input network ip(ex:192.168.122.10/24): " net_ip
read -p "Please input network gateway: " net_gw
read -p "Please input network dns: " net_dns
# 하나라도 입력하지 않았을 경우 입력하라는 메시지 출력후 스크립트 종료
if [[ -z $net_name ]] || [[ -z $net_ip ]] || [[ -z $net_gw ]] || [[ -z $net_dns ]]; then
echo "You need to input network information. Please retry this script"
exit;
fi
# 운영체제가 페도라 계열일 경우 nmcli 명령어를 이용하여 네트워크 IP 설정
if [[ $ostype == "rhel fedora" ]]; then
nmcli con add con-name $net_name type ethernet ifname $net_name ipv4.address $net_ip ipv4.gateway $net_gw ipv4.dns $net_dns ipv4.method manual
nmcli con up $net_name
# 운영체제가 데미안 계열일 경우 netplan에 yaml 파일을 생성하여 네트워크 IP 설정
elif [[ $ostype == "debian" ]]; then
ip_chk=$(grep $net_name /etc/netplan/*.yaml|wc -l)
# 설정하고자 하는 IP로 설정파일이 없을 경우 관련 네트워크 yaml 파일 생성
if [ $ip_chk -eq 0 ]; then
cat > /etc/netplan/${net_name}.yaml << EOF
network:
version: 2
renderer: networkd
ethernets:
$net_name:
dhcp4: no
dhcp6: no
addresses: [$net_ip]
gateway4: $net_gw
nameservers:
addresses: [$net_dns]
EOF
echo "cat /etc/netplan/${net_name}.yaml"
cat /etc/netplan/${net_name}.yaml
echo "apply netplan"
netplan apply
else
echo "This $net_name is configured already."
fi
fi
아래 와 같이 워닝 나오면서 업데이트 안될떄
[root@shell 09. Configuration]# sh netip.sh
=== Network Devices ===
2: ens192:
Please input network interface: ens192
Please input network ip(ex:192.168.122.10/24): 192.168.100.129/24
Please input network gateway: 192.168.100.254
Please input network dns: 8.8.8.8
Warning: There are 2 other connections with the name 'ens192'. Reference the connection by its uuid 'fb49d26a-0fa0-4484-83ad-e8e015249839'
원인은 uuid가 여러개 잡힘
[root@shell 09. Configuration]# nmcli con
NAME UUID TYPE DEVICE
ens192 1bb78d84-5d65-4aa0-be11-53bd42d4f3d6 ethernet ens192
ens192 34e4a350-644e-48fc-b762-e0e6036ddd55 ethernet --
ens192 fb49d26a-0fa0-4484-83ad-e8e015249839 ethernet --
ens192 를 삭제
[root@shell 09. Configuration]# nmcli con delete ens192
다시 스크립트 실행
[root@shell 09. Configuration]# sh netip.sh
=== Network Devices ===
2: ens192:
Please input network interface: ens192
Please input network ip(ex:192.168.122.10/24): 192.168.100.129/24
Please input network gateway: 192.168.100.254
Please input network dns: 8.8.8.8
Connection 'ens192' (13dc4228-e665-4b42-b577-692b2e293c94) successfully added.
확인
[team01@shell ~]$ ip a show ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:7e:cf:ae brd ff:ff:ff:ff:ff:ff
inet 192.168.100.129/24 brd 192.168.100.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::d36:f98a:5fe6:b29b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[team01@shell ~]$
[team01@shell ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.100.129
PREFIX=24
GATEWAY=192.168.100.254
DNS1=8.8.8.8
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens192
UUID=13dc4228-e665-4b42-b577-692b2e293c94
DEVICE=ens192
ONBOOT=yes
[team01@shell ~]$
ubuntu18.04 LTS 테스트
기존에 ens160이 검색 되면 ip_chk 는 1로 확인 되어 else로 빠져 ip가 설정되어 있다고 나옴
해결책은 ip_chk =0 으로 바꿈
[team01@shell 09. Configuration]$ cat netip.sh
#!/bin/bash
# 운영체제 타입 확인
ostype=$(cat /etc/*release| grep ID_LIKE | sed "s/ID_LIKE=//;s/\"//g")
# 네트워크 정보를 사용자로부터 입력 받음
echo "=== Network Devices ==="
ip a | grep '^[0-9]' | awk '{print $1" "$2}' | grep -v -e 'lo' -e 'v' -e 't'
read -p "Please input network interface: " net_name
read -p "Please input network ip(ex:192.168.122.10/24): " net_ip
read -p "Please input network gateway: " net_gw
read -p "Please input network dns: " net_dns
# 하나라도 입력하지 않았을 경우 입력하라는 메시지 출력후 스크립트 종료
if [[ -z $net_name ]] || [[ -z $net_ip ]] || [[ -z $net_gw ]] || [[ -z $net_dns ]]; then
echo "You need to input network information. Please retry this script"
exit;
fi
# 운영체제가 페도라 계열일 경우 nmcli 명령어를 이용하여 네트워크 IP 설정
if [[ $ostype == "rhel fedora" ]]; then
nmcli con add con-name $net_name type ethernet ifname $net_name ipv4.address $net_ip ipv4.gateway $net_gw ipv4.dns $net_dns ipv4.method manual
nmcli con up $net_name
# 운영체제가 데미안 계열일 경우 netplan에 yaml 파일을 생성하여 네트워크 IP 설정
elif [[ $ostype == "debian" ]]; then
ip_chk=0
# 설정하고자 하는 IP로 설정파일이 없을 경우 관련 네트워크 yaml 파일 생성
if [ $ip_chk -eq 0 ]; then
cat > /etc/netplan/${net_name}.yaml << EOF
network:
version: 2
renderer: networkd
ethernets:
$net_name:
dhcp4: no
dhcp6: no
addresses: [$net_ip]
gateway4: $net_gw
nameservers:
addresses: [$net_dns]
EOF
echo "cat /etc/netplan/${net_name}.yaml"
cat /etc/netplan/${net_name}.yaml
echo "apply netplan"
netplan apply
else
echo "This $net_name is configured already."
fi
fi
'shell_script' 카테고리의 다른 글
shell - public cloud AWS (0) | 2021.08.17 |
---|---|
shell - 패스워드 생성 법칙 적용 (0) | 2021.08.11 |
shell - system 관련 스크립트 (0) | 2021.08.02 |
shell 기본 sed (0) | 2021.07.30 |
shell 기본 awk (0) | 2021.07.29 |