-l : 파일의 자세한 정보 출력
-a : 모든 파일 출력 (숨김 파일 포함)
-h : 파일 크기를 읽기 쉽게 출력
ls directory : directory의 파일 목록 출력
ls -lh
df -h
ls --help
ls -al
ls .ssh
cd 변경할 디렉토리
cd - : 현재 디렉토리로 오기 전 디렉토리로 이동
cd : home 디렉토리로 이동 /home/사용자명
cd ~ : 홈 디렉토리
cd . : 현재 디렉토리로 이동
cd .. : 상위 디렉토리로 이동 (cd ../..)
- 절대 경로 : '/'부터 전체 경로를 모두 표시
- /var/log/messages- 상대 경로 : 현재 위치를 기준으로 표시
cp 원본파일 복사할 디렉토리
cp 원본파일 복사파일
-r : 하위 디렉토리까지 모두 복사
# 디렉토리 안의 모든 파일들 복사 #
cp -r /etc/* /tmp
# 디렉토리 자체를 복사 #
cp -r /etc /tmp
mv /lab /home/hj
# 디렉토리 옮기면서 디렉토리명 변경 #
mv /lab /home/hj/lab2
# 파일명 변경 #
mv test test2
# 상위 디렉토리가 없으면 생성 #
mkdir -p a/b/c/d
less 파일명
→ less는 뒤로 가기 가능
→ v 키를 입력하면 편집 가능
cat 파일명 : 문서 보기
cat > 파일명 : 화면에 입력하는 내용을 파일에 저장. 입력 후에 ctrl + d 를 입력해서 저장하고 종료.
cat >> 파일명 : 기존 파일 내용에 추가하기
cat > test2 < test
→ test2를 만들고, test의 내용을 입력
a 2> error.txt
cat error.txt
-bash: a: command not found
a 2> /dev/null
파일이나 디렉토리의 소유자, 그룹을 표시, 소유자도 그룹도 아닌 사용자는 그 외(Other).
해당 사용자가 파일에 접근하고자 할 때 소유권에 다라 접근 권한이 달라짐.
-rw-r--r-- 1 hj hj 390 Jul 1 09:23 authorized_keys
소유자 그룹
→ 사용자(User), 그룹(group), 그 외(other) 별로 권한을 가짐.
파일이나 디렉토리에 대한 권한(Read, Write, eXecute).
permission denied의 원인.
파일 : r(읽기), w(쓰기), x(실행)
디렉토리 : r(목록 읽기), w(디렉토리에 파일 쓰기), x(cd로 접근하기).
→ 허가권은 user, group, other 별로 부여됨.
⇒ rwx rwx rwx (user, group, other)
⇒ 7 7 7 (permission을 숫자로 표시)
ex) 644 = rw-r—r—
chown new_user.new_group 파일명
chgrp new_group 파일명
→ 소유권 변경
chmod 숫자 방식/문자 방식 파일명
=> 숫자 방식은 모든 사용자별로 모두 작성 : 755, 640, 400
=> 문자 방식은 변경되는 사용자만 작성 : u+x, o-w, ug+x, a=rw
→ 허가권 변경
usermod -aG 그룹명 사용자
→ 사용자를 특정 그룹에 포함시킬 경우
<setuid / setgid>
실행 파일을 실행할 때 실행 파일의 소유자 권한이 아닌 실행하는 사용자의 권한으로 실행이 되는 것이 일반적인 상황.
소유자 혹은 소유 그룹의 권한으로 실행하는 것이 필요할 경우 setuid, setgid 퍼미션을 부여해야함.
<'stickybit'>
ex) 4755, 2644, 1755 …
4755(setuid), 2755(setgid), 1755(stickybit)
→ 기존 퍼미션 앞에 붙음.

프로그램이 실행되어 메모리에서 동작하고 있는 상태
데몬이라고도 하며 백그라운드에서 동작하면서 요청이 있을 경우 응답하는 프로세스
ps : 현재 터미널에서 동작시킨 프로세스 확인
ps -ef : 현재 시스템에서 동작 중인 모든 프로세스
ps aux : “
kill -l : 시그널 출력
# 시그널 #
SIGHUP(1) : 행 업. 프로세스 일시 중지 했다가 다시 실행. 설정 파일을 다시 읽어 들임.
SIGINT(2) : ctrl + c 에 의해 발생. 강제 종료
SIGKILL(9) : 강제 종료
SIGTERM(15) : 기본 시그널. 정상 종료
SIGTSTP(20) : 일시 정지
# EX #
sleep 1000
jobs
bg %1
kill %1 or kill -9 %1
systemctl, service : 서비스(데몬)를 제어하는 명령
systemctl 명령 서비스명.service ⇒ service 생략 가능
systemctl 명령 서비스명.socket
# 명령 #
1. start : 서비스 시작
2. stop : 서비스 종료
3. restart : 서비스 재시작
4. status : 서비스 상태 확인
5. enable : 부팅 시 서비스 시작
6. disable : 부팅 시 서비스 시작 안함
# EX #
systemctl start docker = service docker start
systemctl start telnet.socket = service telnet.socket start
vi /etc/sysconfig/selinux
SELINUX=enforcing => disabled
로 변경하고 저장 후 리부팅 (영구적 적용.)
setenforce 0
=> 일시적으로 해제
jobs : 작업 목록 출력
fg : 중단된 프로세스(작업)를 포그라운드에서 동작
fg %작업번호 : 현재 멈춰있는 작업을 포그라운드로 동작
→ 포그라운드에서 동작 중인 프로세스를 중단 시킬때 ctrl + z (SIGTSTP)
→ % 생략 가능
bg : 중단된 프로세스(작업)를 백그라운드에서 동작
bg %작업번호 : 현재 멈춰있는 작업을 백그라운드로 동작
→ % 생략 가능
명령 & : 해당 명령을 백그라운드에서 동작시킴.
kill %작업번호 : 해당 작업 종료
→ % 생략하면 PID가 됨.
at : 특정 시점에 수행할 작업을 지정하고 해당 시점에서 자동으로 작업 수행
cron : 주기적으로 수행할 작업을 지정하고 매 시점에서 해당 작업 수행
at 14:17 today
실행할 작업1
실행할 작업2
ctrl + d
→ at 날짜, 시간 지정
crontab -e
분 시간 일 월 요일(0~6)
40 * * * 2 mkdir /root/testdir ; cp /usr/bin/s* /root/testdir
→ crontab -e : 반복적으로 수행할 작업 / 쉘 스크립트 등록(vi)
at.deny, at.allow / cron.deny, cron.allow
.deny : 해당 파일에 등록된 사용자는 at, cron 사용 불가
.allow : 해당 파일에 등록된 사용자만 at, cron 사용 가능
.deny, .allow 파일이 모두 있는 경우 .allow 가 적용
내용이 비어있는 경우 모두 허용
/etc/sudoers 파일에 사용자를 등록하고 사용할 수 있는 명령을 지정
su 명령으로 root로 사용자를 전환하고 명령을 수행할 수 있으나 특정 명령만 허용할 수 없음.
# 옵션 #
1. c : 파일 묶기
2. x : 묶인 파일 풀기
3. v : 묶거나 푸는 과정 출력
4. t : 실제로 풀거나 묶지 않고 파일 확인
5. f : 장치나 파일 지정
# EX #
tar cvf test.tar c*
tar xvf test.tar
tar tvf test.tar
tar xvf test.tar -C /tmp : -C 옵션은 tar 해제 위치 지정
# 압축 #
gzip 파일명
bzip2 파일명
xz 파일명
cmpress 파일명
zip 파일명.zip 파일명
# 압축 해제 #
gunzip 파일명 = gzip -d 파일명
bunzip2 파일명 = bzip2 -d 파일명
xz -d 파일명
uncompress 파일명
unzip 파일명
tar xvfz 파일명.tar.gz
→ gzip으로 압축 해제하고 tar 파일 풀기 동시에 진행.
tar xvfj 파일명.tar.bz2
→ bz2로 압축 해제하고 tar 파일 풀기 동시 진행.
tar xvfJ 파일명.tar.xz
→ xz로 압축 해제하고 tar 파일 풀기 동시 진행.
tar xvfZ 파일명.tar.Z
→ compress로 압축 해제하고 tar 파일 풀기 동시 진행.
ext2, ext3, ext4, xfs : 리눅스 파일 시스템
df -Th
→ 파일 시스템 확인 명령어
xfs → /lost+found 디렉토리 생성 X
ext4 → /lost+found 디렉토리 생성 O (마운트 지점)
poweroff
halt
shutdown -h now
init 0
reboot
shutdown -r now
init 6
ls /dev
fdisk -l
fdisk /dev/sda
new
enter
enter
enter
w
fdisk /dev/sda
mkfs -t ext4 /dev/sda1
mkdir /mnt/mpoint
cp /usr/sbin/x* /mnt/mpoint
mount -t ext4 /dev/sda1 /mnt/mpoint
파티션 생성 : 파티션은 파일 시스템을 생성하기 위한 구역
파일 시스템 : 파일 시스템은 파일을 저장하기 위한 체계. OS마다 다름.
생성된 파일 시스템을 리눅스에서 사용가능하도록 mount 함 : mount는 장치를 리눅스에서 사용가능하도록 연결하는 것.
시스템이 리부팅 후에도 mount된 상태로 사용하기 위해 /etc/fstab 파일에 등록을 해야함.
/var/named/chroot/var/named
→ Resource Record : NS(name server), A(IPv4주소), AAAA(IPv6주소), MX(메일서버), CNAME(canonical name), PTR(pointer)
FTP 서버에 파일을 저장하고 클라이언트에서 파일을 다운로드하거나 업로드하는 서비스
→ (TCP 21(세션), 데이터 포트(20, 또는 임의의 포트))
→ FTP는 보안 취약 (패킷 캡쳐 시, 파악 가능)

→ 서버가 클라이언트에 접속
→ 탐색기, cmd는 Active로 접속

local_enable=YES 설정 시, 사용자가 로그인 했을 경우 해당 사용자의 홈 디렉토리를 ‘/’(root)로 인식하도록 하는 설정
vsftp 설치
dnf install vsftpd
systemctl start vsftpd
systemctl stop firewalld
systemctl disable firewalld
netstat -ntlp : n(numeric), t(tcp), l(listening), p(pid)
ftp 192.168.187.130
사용자 : admin
암호 :
#인스턴스 -> 보안 -> 인바운드 규칙 추가 -> 21번 TCP 추가
sudo apt install vsftpd
Rocky FTP 설정 파일 : /etc/vsftpd/vsftpd.conf
Ubuntu FTP 설정 파일 : /etc/vsftpd.conf
anonymous 접속 허용
cd /etc/vsftpd
vi vsftpd.conf
내용 수정
12 anonymous_enable=YES
15 local_enable=NO
ftp 192.168.187.130
사용자 : anonymous
암호 : X (enter)
→ ls → pub 존재
cd /var/ftp
ls
pub
→ pub 위치
Passive 접속 허용
sudo vi /etc/vsftpd.conf
listen=YES
listen_ipv6=NO
pasv_min_port=5001
pasv_max_port=5002
pasv_address=43.200.245.174
→ 서버가 private주소를 가지고 있는 경우 공인 주소를 설정함
chroot 설정
sudo vi /etc/vsftpd.conf
122 chroot_local_user=YES
123 chroot_list_enable=YES
125 chroot_list_file=/etc/vsftpd.chroot_list
126 allow_writeable_chroot=YES
cd /etc
sudo touch vsftpd.chroot_list
sudo systemctl restart vsftpd
sudo vi vsftpd.chroot_list
admin2
sudo useradd -g admin -s /bin/bash -m -d /home/admin admin
sudo passwd admin
vi vsftpd.chroot_list
admin2
admin
sudo systemctl restart vsftpd
→사용자에 따라 홈 디렉토리를 벗어나지 못하도록 설정
ubuntu@ip-172-31-6-203:/etc$ sudo echo "admin3" > vsftpd.chroot_list
-bash: vsftpd.chroot_list: Permission denied
echo "admin3" | sudo tee -a vsftpd.chroot_list
→ echo는 setuid가 없음 → tee 사용으로 해결
→ window ↔ unix 사이의 파일 및 장치 공유 서비스
→ smb, cifs 프로토콜 사용
→ TCP 137, 139, 445번 사용
→ rpm → 레드햇 계열 패키지 매니저
Window : 폴더 공유 → 리눅스에서 해당 폴더 접근
Linux : samba 패키지(서버) 설치, samba-client 패키지 설치
Samba 서버 패키지 설치
dnf install samba
cd /etc/samba/smb.conf
=> samba 설정 파일
=> 기본값은 로컬 사용자의 홈 디렉토리를 공유함.
systemctl start smb
systemctl start nmb
=> IP 대신 컴퓨터 이름으로 접근 할 수 있는 서비스
netstat -ntlp
tcp6 0 0 :::139 :::* LISTEN 4515/smbd
tcp6 0 0 :::445 :::* LISTEN 4515/smbd
Samba 사용자 등록
smbpasswd -a admin
vi /etc/sysconfig/selinux
SELINUX=disabled
setenforce 0
Window → 탐색기
\\192.168.187.130
네트워크 우클릭 → 네트워크 드라이버 연결 → 폴더
\\192.168.187.130\admin

→ 내 PC의 드라이브처럼 사용 가능 (mount해서 사용)
→ 네트워크 드라이브로 연결
samba-client, cifs-utils 설치
sudo -i
apt install samba-client cifs-utils
mount / 연결
mkdir /mnt/admin
mount -t cifs //192.168.187.130/admin /mnt/admin -o username=admin,password=password
연결 해제 (/mnt/admin 디렉토리에 있으면 X)
umount /mnt/admin
samba 설정 파일 수정 (최 하단 추가)
vi /etc/samba/smb.conf
45 [share]
46 path = /var/samba
47 public = yes
48 force_user = share
49 force_group = share
50 writable = yes
사용자 추가
useradd -s /bin/nologin share
smbpasswd -a share
공유 폴더
mkdir /var/samba
mount / 연결
mkdir /mnt/share-dir
mount -t cifs //192.168.187.130/share /mnt/share-dir -o username=share,password=password
→ Network File System
→ 네트워크를 통해 다른 시스템(NFS 서버)이 공유하고 있는 디렉토리를 파일 시스템처럼 연결(mount)해서 사용하는 것.
→ TCP 2049번 포트 사용
NFS 설치
dnf install nfs-utils
공유 디렉토리 설정
vi /etc/exports
공유할 디렉토리 클라이언트 주소/네트워크(NFS 옵션)
/var/nfs-share 172.21.185.172(rw)
/var/nfs-share *(rw,insecure)
/var/nfs-share *(rw,insecure,no_root_squash)
=> root 권한으로 쓸 수 있게 함.
mkdir /var/nfs-share
NFS 서비스 실행
systemctl start nfs-server
systemctl enable nfs-server
공유 목록 확인
exportfs -v
NFS-client 설치
apt install nfs-common
mount 및 접속
mkdir /mnt/nfs-dir
mount -t nfs 192.168.187.130:/var/nfs-share
→ SMTP(TCP 25번).
→ 메일 서비스를 위해서는 DNS 서비스 필수. (MX resource record 필요)
zone 파일 수정
cd /var/named
vi nhj.zone
1 $TTL 86400
2 @ IN SOA ns admin (
3 20240703 ; serial
4 1D ; refresh
5 1H ; retry
6 1W ; expire
7 3H ) ; minimum
8 IN NS ns
9 IN MX 10 mail
10
11 ns IN A 192.168.187.130
12 aws IN A 43.200.245.174
14 www IN A 192.168.187.130
17 mail IN A 192.168.187.130
systemctl restart named
ncpa.cpl → wifi 연결 → 속성 → DNS 주소 → Rocky IP로 수정
nslookup mail.nhj.com
서버: ns.nhj.com
Address: 192.168.187.130
이름: mail.nhj.com
Address: 192.168.187.130
postfix, dovecot 설치
dnf install postfix dovecot
postfix 주 설정파일
/etc/postfix/main.cf
메일 서버 호스트 설정
postconf -e 'myhostname = mail.nhj.com'
메일 도메인 설정
postconf -e 'mydomain = nhj.com'
발송자 도메인 설정
postconf -e 'myorigin = $mydomain'
리스닝 인터페이스 설정
postconf -e 'inet_interfaces = all'
ipv4만 사용하도록 설정
postconf -e 'inet_protocols = ipv4'
메일을 받을 도메인 설정
postconf -e 'mydestination = $mydomain,localhost.$mydomain,localhost,$mydomain,/etc/postfix/local-host-names'
touch /etc/postfix/local-host-names
SMTP 인증을 위한 설정
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'smtpd_sasl_local_domain = $myhostname'
postconf -e 'smtpd_client_restrictions = permit_mynetworks,permit'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject'
dovecot 주 설정파일
vi /etc/dovecot/dovecot.conf
프로토콜 설정
protocols = imap pop3 lmtp => protocols = imap pop3
리스닝 인터페이스 설정
listen = *, :: => listen = *
비밀번호 인증 설정
vi /etc/dovecot/conf.d/10-auth.conf
#disable_plaintext_auth = yes => disable_plaintext_auth = no
auth_mechanisms = plain => auth_mechanisms = plain login
메일박스 위치 변경
vi /etc/dovecot/conf.d/10-mail.conf
#mail_location => mail_location = mbox:/var/empty:INBOX=/var/spool/mail/%u:INDEX=MEMORY
SMTP 인증 설정
vi /etc/dovecot/conf.d/10-master.conf
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
vi /etc/dovecot/conf.d/10-ssl.conf
ssl = no
메일서버 시작
systemctl restart postfix dovecot
포트 개방 확인
netstat -ntlp
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
telnet 설치
dnf install telnet
telnet을 통해 접속
telnet localhost 110
user admin
pass
telnet을 통해 접속 (dovecot)
telnet localhost 25
ehlo naver.com
auth login
334 VXNlcm5hbWU6
YWRtaW4= => admin
334 UGFzc3dvcmQ6
Z3Vkd25zNTYzNw== => pass
=> base64로 인코딩 된 값
nslookup을 위한 설치
dnf install bind-utils
nslookup mail.nhj.com
C:\Windows\System32\drivers\etc\hosts
-> 최 하단에 192.168.187.130 mail.nhj.com 추가

mariadb 설치
yum install mariadb-server
systemctl start mariadb
roundcube에서 사용할 데이터베이스 생성
mysql -uroot -p (passwd X -> Enter)
CREATE DATABASE roundcubemail CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcubemail.* TO round@localhost IDENTIFIED BY 'goodee@0205';
roundcube가 동작하기 위해 필요한 패키지 설치
sudo dnf install httpd -y
sudo dnf install epel-release -y
sudo dnf install wget postfix certbot postfix-mysql httpd vim policycoreutils-python-utils -y
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
sudo dnf module -y reset php
sudo dnf module enable php:remi-8.0 -y
sudo dnf install php-{pear,cgi,common,curl,gmp,fpm,mbstring,gd,mysqli,gettext,bcmath,json,xml,fpm,intl,zip} -y
systemctl start httpd
roundcube 설치
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.7/roundcubemail-1.6.7-complete.tar.gz
압축 해제 및 이동
tar xfz roundcubemail-1.6.7-complete.tar.gz -C /var/www/html/
디렉토리 이름 변경
mv roundcubemail-1.6.7/ rc
브라우저로 접속
http://mail.nhj.com/rc/installer/
Roundcube Webmail Installer
cd /config
vi config.inc.php -> 붙여넣기
나머지 설정
cd /var/www/html/rc
chown apache.apache temp logs
접속 확인
http://mail.nhj.com/rc/
unzip 설치 및 압축 해제
sudo apt install unzip
mkdir guestbook
cd guestbook
unzip guestbook.zip
JDK 설치
sudo apt install openjdk-11-jdk
mariadb-server 설치
sudo apt install mariadb-server
src 파일 수정
cd /src/main/resources
vi application.properties
server.port=80
spring.datasource.initialization-mode=always
### Static setting
spring.datasource.url=jdbc:mysql://localhost/guestbook
spring.datasource.username=root
spring.datasource.password=edu
### Use Environment Variable
#spring.datasource.url=jdbc:mysql://${MYSQL_IP}:${MYSQL_PORT}/${MYSQL_DATABASE}
#spring.datasource.username=${MYSQL_USER}
#spring.datasource.password=${MYSQL_PASSWORD}
~
mariadb 추가
sudo mariadb -uroot -p
create database guestbook
grant all privileges on guestbook.* to root@localhost identified by 'edu';
build
cd /home/ubuntu/guestbook
chmod a+x mvnw
./mvnw clean package
실행
sudo systemctl stop nginx (80번 사용중)
sudo java -jar target/guestbook-0.0.1-SNAPSHOT.jar
접속
http://AWS우분투IP
⇒ 배포가 복잡.
⇒ 배포 자동화(CI/CD)가 필요