[Linux] commands, SSH

gununoo·2022년 7월 19일
1

Linux

목록 보기
2/10
post-thumbnail

리눅스의 시작 -> 리누스 토발쯔(핀란드)

Unix 기업용(가상화 진골) -> Multi user, Multi tasking
리눅스의 커널 0.1 -> 0.2 인터넷에 공개

Architecture of Linux OS
Application -> Shell -> Kernel -> Hardware
Application: httpd, sshd, ftp 등

OS에서 사용하는 애플리케이션, 툴, 서비스 등은 커널의 허락이 있어야 물리 자원에 접근이 가능하고 해당 서비스를 실행, 중지시킬 수 있다.

https://kernel.org/
리눅스의 커널이 공개되어있음

uname -a 

-> 현재 커널 버전 확인
새로운 커널 다운로드, 컴파일, 설치할 수 있음
x86 -> 일반적인 범용 CPU(인텔, AMD)

엄밀한 의미에서의 리눅스: kernel
보편적인 의미에서의 리눅스: 배포판 리눅스

데비안
-> Ubuntu(컨테이너/k8s)

Red Hat
-> RHEL(Redhat Enterprise Linux, 기업용, 패치/기술지원/업데이트 등에 대한 비용을 과금)
-> CentOS(클라우드/관리 IaC)

https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg

클라우드에서의 리눅스
초기 DC(Data Center) -> Unix 사용 -> 고가의 서버 장비가 필요하고, x86은 외면 받음 -> Intel/AMD에서 cpu 가상화를 개발함 -> VMware 1.0이 출시하고서, UNIX를 대체하기 시작함 -> 하이퍼바이저 위에 여러 VM을 사용할 수 있음

https://www.redhat.com/ko/topics/virtualization/kvm-vs-vmware-comparison

클라우드 환경을 위한 다양한 도구들은 독립적으로 동작해서는 큰 효과를 볼 수 없다. 다른 도구들과의 연계를 통해 효과를 극대화할 수 있다. 이를 위해서는 서로 간의 호환 문제가 해결되어야 하는데, 이를 리눅스 상에서 해결할 수 있다.

배포판 리눅스는 모두 다른가? -> 대부분 비슷하나 파일 시스템의 구조는 다르다.

ONOS -> 클라우드 및 5G 환경에서의 SDN(Software Defined Network)를 위한 리눅스
Kali Linux -> 데비안 계열의 모의 침투 테스트를 위한 리눅스

대부분의 리눅스에서는 현재 bash와 같은 쉘을 사용하고 있으므로 명령어는 큰 틀에서 비슷하다.

user

cat /etc/passwd 

-> 여러 사용자들이 있다
/etc/passwd는 현재 시스템 내에 있는 사용자들의 정보를 출력해준다.
root, user1은 일반적인 사용자를 의미한다.
apache는 일반적인 사용자가 아니라 웹서비스를 실행할 수 있는 서비스라고 생각해야 한다. 로그인할 수 있는 계정은 아니다.

사용자 --> systemctl restart httpd --> apache --> 웹서비스 재실행

cat /etc/passwd | grep root 

"root" -> 계정 이름(ID)
"x" -> 패스워드는 passwd 파일에 기록되지 않는다. 패스워드는 etc/shadow 파일에 저장된다.
"0" -> user의 ID 번호, root는 superuser이므로 0이다.
"0" -> 해당 사용자가 소속되어있는 그룹의 번호(GID)
-> 리눅스의 모든 사용자들은 무조건 하나의 그룹(Primary Group)에 포함되어야 한다. 처음 사용자를 생성하면 사용자 이름과 동일한 그룹이 만들어진다. 그리고 해당 사용자는 자신 이름의 그룹에 자동으로 포함된다.
"root" -> 계정의 이름(full name)
"/root" -> 홈 디렉토리
"/bin/bash" -> 해당 사용자가 사용하는 shell. 최근에는 리눅스에서 기본적으로 bash를 사용하는 경우가 많다. ubuntu의 경우에는 dash를 사용하나, 인증 과정에서는 bash를 사용한다.

cat /etc/passwd | grep user1

"1000" -> user1는 일반 사용자이므로 1000부터 시작

groups root 

-> root가 어느 그룹에 속해있는지 보여준다.

groups user1 

-> 두 개의 그룹에 포함되어있다.
-> 하나의 계정은 여러 계정에 동시에 포함될 수 있다.
-> primary group은 벗어날 수 없고, 본인의 이름과 동일하다.

cd(디렉토리 이동하기)

  • 절대 경로: /
  • 상대 경로: 상위 -> .. , 현대 디렉토리 -> .
  • la -a: 숨겨진 파일이나 디렉토리를 포함하여 출력 -> .과 ..이 있다

파란색 -> 디렉토리

ls -a: 숨김 파일/디렉토리
ls -l: 상세 정보 출력

-: 일반 파일
d: 디렉토리
l: 링크가 걸려있는 파일(soft link(심볼릭), hard link)

owner, group, others
"r": read
"w": write
"x": excute

https://remy.parkland.edu/~smauney/csc128/permissions_and_links.html

파일 생성

1. touch

빈 파일 만들기. 실제 목적은 시간을 갱신하기 위한 것이나 주로 빈 파일을 만드는 용도로 사용된다.
touch test.txt

2. echo > test.txt

3. vi test.txt

vi(m): 화면 단위 편집기
vi를 사용하면 방향키, 키패드 등의 사용에서 불편함이 많다. vim 사용을 추천한다.
vim을 vi 명령어로 실행시키기 설정

vim .bashrc 

-> .bashrc 열기

alias vi='vim'

-> 한 줄 추가

.bashrc는 사용자가 처음 부팅할 때 읽어들이는 파일이며 주로 환경 정보 적용이나 alias 등을 현재 적용하고자 하는 것을 미리 입력해 두면 편리하다. 오타가 있을 경우 정상 로그인이 되지 않을 수 있으므로 조심해야한다.
변경된 .bashrc를 현재 환경에 다시 적용하고자 한다면
1) su 를 이용하여 재 로그인한다.
2) source .bashrc -> 현재 환경에 .bashrc를 적용시키겠다.

4. cat과 EOF

  • 여러 줄이 들어간 새로운 파일을 만들 수 있다

cat < test.txt

  • test.txt 파일의 내용을 입력받아 쉘에 출력

cat < test.txt > test2.txt

  • test.txt 파일의 내용을 입력받아 test2.txt에 저장

cat << EOF > test.txt 
  • 한 줄 씩 입력 받아
    EOF가 나오면 test.txt에 저장

파일 내용 살펴보기

cat

cat anaconda-ks.cfg

more

more anaconda-ks.cfg 

enter -> 한 줄 씩 내려간다
space bar -> 한 페이지 씩 내려간다
b 키 -> 거꾸로 돌아간다
q 키 -> 빠져나간다

less

less anaconda-ks.cfg
more와 동일하며 추가적으로 방향키 사용이 가능하다

head/tail

상위 10줄

head naverheader.html 

상위 3줄

head -3 naverheader.html 

tail 명령어도 마찬가지

cp

파일 복사

cp ~/anaconda-ks.cfg .

  • 상위 디렉토리에 있는 anaconda-ks.cfg 파일을 현재 디렉토리(.)로 복사

cp -r ../Downloads/ .

  • -r: 디렉토리 복사

mv

파일/디렉토리 이동, 이름 변경

rm

디렉토리 삭제
파일 삭제

rm -f: 물어보지 않고(프롬프트 띄우지 않고) 즉시 삭제
rm -r: 디렉토리 또는 파일 삭제
rm -rf: 물어보지 않고 즉시 디렉토리 또는 파일 삭제 -> 자주 사용하지만 조심해야 함. 복구 쉽지 않음

mkdir

d/e/를 한 방에 만들고 싶을 때

mkdir d/e

-> 안 된다

mkdir -p d/e 

-> parent인 d를 먼저 만들고, 그 안에 폴더 e를 만든다

history

history

입력했던 명령어 볼 수 있음

wget, curl

yum -y install wget curl 

-> wget, curl 설치

wget: 특정 웹주소로부터 파일 등을 다운로드하기 위한 툴
https://www.rpmfind.net

원하는 app 검색 -> 맞는 버전의 링크 복사

wget https://www.rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/gedit-3.28.1-3.el7.x86_64.rpm

curl: 웹사이트 주소를 통하여 해당 페이지의 코드를 다운로드하거나 api 연결, 파일 다운로드 등에 활용된다.

curl localhost 
curl http://localhost 

curl http://www.naver.com 


-> 특정 웹사이트에 접속이 가능한지 불가능한지 판단할 수 있음
-> 302 에러가 나옴

curl -L http://www.naver.com 
  • -L: 포트포워딩(http(80)로 접속한다면 https(443)로 리다이렉트)이 되어있다면 해당 페이지까지 들어가서 코드의 내용을 확인한 뒤 화면에 출력시켜준다.

curl -L http://www.naver.com -o naverindex.html 

-> -o: 내용을 파일로 저장

curl을 이용하여 페이지의 헤더 내용을 포함하여 확인하고 싶다면??

curl -i http://www.test.com 

curl -O http://www.test.com/test.zip 

-> -O: 파일 다운로드
-> wget과 같은 기능

curl -x proxy서버주소:포트번호 http://www.test.com 

-> -x: 프록시 서버를 통해 접속

proxy 서버(대리인)

https://docs.oracle.com/cd/E19146-01/821-1828/ghquv/index.html

  • 내부 사용자들의 웹 접속 속도 향상
  • 인증 등을 거쳐 인터넷 사용 가능
  • url filter 적용 또는 특정 컨텐츠 필터링을 통한 보안에도 활용이 가능하다

init(run level)

https://continuetochallenge.tistory.com/66

namespace -> 별도의 독립적인 작업 공간을 가질 수 있다
cgroup -> 각각의 별도의 작업 공간에 별도의 리소스를 적용시킬 수 있다.

0: 종료모드 -> init 0, poweroff, shutdown -P now
1: 복구모드 -> 시스템 관리를 위한 목적으로 활용(네트워크, 다중접속 불가)
2: 네트워크를 지원하지 않는 multi-user
3: 네트워크가 지원되는 multi-user, 일반적인 CLI 부팅
5: 네트워크가 지원되는 multi-user, 그래픽 환경으로의 부팅
6: 재부팅: init 6, reboot, shudown -r now, shutdown -r 22:00
shutdown -c(예약된 종료, 재부팅을 취소)
shutdown -k + 15 현재시간으로부터 15분 후에 종료된다는 것을 접속된 사용자들에게 알려주지만 실제로 종료가 되지는 않는다.

런레벨 조정하기

vi /etc/inittab 

systemctl set-default multi-user.target 

-> runlevel 3(CLI)으로 변경되었음
-> init 6으로 재부팅

startx

-> GUI로 일시적으로 전환됨

  • runlevel 5(GUI)으로 변경하기
systemctl set-default graphical.target

motd 설정

vi /etc/motd 

네트워크 관련 명령들

1. ip addr

ip addr list 
ip addr show 

2. ip route

ip route 


-> 라우팅 테이블 출력
-> gw 확인할 수 있음
-> gw: 211.183.3.2

3. netstat -nr

netstat -nr 


-> 라우팅 테이블

4. /etc/hosts 파일 등록하기

cat << EOF >> /etc/hosts 
> 211.183.3.201 centos7
> 211.183.3.111 centos8 
> EOF

cat /etc/hosts 

ping centos7
ping centos8 

5. nslookup

nslookup 
> server
> www.naver.com


-> cname으로 보인다


-> type A로 보인다

일반적으로 도메인에 대한 IP 정보는 TYPE A로 보인다.
ex) www.test.com A 1.1.1.1

여러 서버가 하나의 도메인을 활용하는 경우에는 CNAME을 사용하여 구성한다.

https://www.techtarget.com/searchwindowsserver/definition/canonical-name

6. ifdown/ifup

인터페이스 비활성화/활성화
활성화 될때는 인터페이스의 구성 파일을 읽고 실행된다. 따라서 IP주소등을 변경했을 때에는 systemctl restart network 를 이용하거나 특정 인터페이스를 down > up 하여 활성화 하면 변경된 사항을 적용시킬 수 있다.

ifdown ens32
ifup ens32 

원격지에 있는 서버로 접속하기

  1. CLI -> telnet(X), SSH(O)
  2. GUI -> VNC, SPICE, PCoIP,

ssh -> 서버에 대한 인증, 사용자에 대한 인증(key-pair, password)

[centos7]

systemctl status sshd 

-> 켜져있는 것 확인

ls /etc/ssh/

ssh_config -> client의 설정
sshd_config -> host의 설정

vi /etc/ssh/sshd_config 

ListenAddress -> 나에게 접속 가능한 주소

PermitRootLogin yes -> 누군가가 root로 로그인할 수 있음 -> 보안 상 좋은게 아님

MaxSessions -> 한 번에 접속할 수 있는 사용자 수

PubkeyAuthenticaiton -> 퍼블릭키 인증 -> 주석 처리되어 있어 꺼져있음

PasswordAuthentication yes -> 비밀번호 인증 -> 보안 상 나쁨

비밀번호 인증 -> 보안 상 나쁨 -> PubkeyAuthentication의 주석을 해제해서 켜기

systemctl restart sshd 

-> config 반영시키기

서비스 실행 시 오류가 발생한다면?
-> systemctl status sshd 로 확인

[centos8]

ssh -l root centos7 
known hosts 추가 -> yes 

ls .ssh/ 

centos8에 .ssh라는 디렉토리가 생겼음
그 안에 knownhost라는 파일이 생겼음

다시 ssh -l root centos7 로 접속
-> ECDSA host key 생성에 대해 묻지 않음

known_hosts 삭제

rm -f known_hosts

다시 ssh -l root centos7 로 접속

ssh -l root centos7 

ECDSA host key 생성에 대해 물음

known_hosts에 centos7 key가 추가하기

ssh-keyscan centos7 > .ssh/known_hosts

다시 ssh -l root centos7 로 접속

접속 성공

ssh-keygen

ssh-keygen -q -f ~/.ssh/testkey.pem -N ""

-N: 비밀번호 설정은 안 함

ls ~/.ssh
testkey.pem이 생성되었음

vi testkey.pem
-> 전체 복사하기

[centos8]

touch testkey.pem 
vi testkey.pem 


-> 전체 붙여넣기

chmod +x 600 
ssh -i testkey.pem 

[centos7]

vi /etc/ssh/sshd_config  

passwordauthentication no로 변경

cd .ssh 
cp testkey.pem.pub authorized_keys 

systemctl restart sshd 

[centos8]

ssh -i testkey.pem centos7

ssh -i testkey.pem centos7 hostname 
ssh -i testkey.pem centos7 ifconfig ens32 

실제 환경이라면 관리 서버에서 key-pair를 생성한다.
관리자는 private key를 갖는다. public key는 내가 관리하고자하는 다수의 서버에 등록시킨다.

원격지에 있는 서버에 public key를 등록하기 위해서는 ssh-copy-id를 이용한다.
관리용 서버의 .ssh/authorized_keys에 등록시킨다.
우리는 인스턴스 템플릿 이미지에 미리 public key를 넣어둘 예정이다.

user를 관리자 등급으로 사용하기

[centos7]
user 생성

useradd user10 
passwd user10 
[패스워드 지정]

user 생성 더 간단하게

useradd user20 
echo 'user20:user20' | chpasswd 

user 생성 더 더 간단하게

useradd user30 && echo 'user30:usr30' | chpasswd


-> 계정이 생성되었고 비밀번호도 설정된 것 확인

일반 사용자는
sudo systemctl restart firewalld
-> 실행 불가

vi /etc/sudoers 
:set nu 

107째 줄 -> wheel은 모두 실행 가능

groups user1 


-> wheel 그룹에 속해있음

su user1 
sudo systemctl restart firewalld 

-> 실행 가능하다
-> wheel group 안에 포함되어있기 때문

groups user30
-> user30 : user30

vi /etc/sudoers 
:set nu 

107째 줄 -> 주석처리
110째 줄 주석 해제 -> wheel 그룹은 패스워드 없이도 실행 가능

usermod -aG wheel user30 

-> user30을 wheel 그룹에 추가

su user30 
sudo systemctl restart firewalld 

-> 이제 된다

groups user30 

-> user30 : user30 wheel

profile
take a look

0개의 댓글