DevOps/Linux

리눅스 명령어

물꼮이 2021. 10. 27. 15:15

window pc 에 까는 리눅스는 -> 우분투 계열 
라즈베리파이에 까는 리눅스는 -> 데비안 계열 

Android 는 리눅스 기반 
Mac은 유닉스 기반 

* 리눅스는 서버에서도 압도적 ! 
 펌웨어 개발 : 운영체제 없이 개발 하는 것 

** Shell 은 사용자와, 커널과의 "인터페이스"
    쉘을 통해 명령을 주고 받음, os가 부팅되자마자 실행 

OS = 커널 + app + shell
* 리눅스는 os가 아닌 커널(OS의 핵심 소스코드 역할)이다! 
* 리눅스에 app, shell 을 추가해 만든 하나의 운영체제를 "리눅스 배포판" 이라고 한다.
* os에서 가장 필수적인 요소는 : 스케줄링, 자원관리 ***

* window의 shell 세가지 종류
  ->  cmd / powershell / window (GUI그자체가 쉘)
* 우분투의 GUI shell은 ? =>  GNOME
   우분투의 CLI shell은 ? => bash 외 여러개 
      *** 본인이 사용하고 있는 쉘은 뭔지 알아야 shell script 작성할 때 오류 잡을 수 있음 !! (shell script 명령어가 조금씩 다름)
* 라즈베라피이 용 쉘 : LXDE (저성능 컴퓨터 전용의 쉘)



윈도우+쉬프트+S (윈도우에서, 우분투에서 하면 키 안먹음요)

공유폴더로 만들 때
루트/home/본인아이디/우분투에서만든폴더이름     

ctrl +(alt) + T : 터미널 실행 키 

ls : 디렉토리 목록 
-a : 숨김파일 출력 * 파일명 맨앞이 . 으로 시작하면 숨김파일 나타냄퍄 ㅁ.
-l : 리스트 형태로 상세보기

pwd : 현재 작업중인 디렉토리 확인
ctrl + l : 화면 지우기

cd : 디렉토리 이동하기 
cd ..: 이전 디렉토리
cd / : 루트 디렉토리 
./ : 현재파일
cd ~ : super user 권한!!!!! $ 앞이 root 인 일반 사용자라면 디렉토리 못만듦!!! *****************

f11 : 화면 전체키우기
ctrl + shift + t : 새탭 열기
alt + 1 2 3... : 창 간 전환 
ctrl + shift + w : 탭닫기  

ctrl + insert : 복사
shift + insert : 붙여넣기

ctrl +s : 터미널 멈추기
ctrl + q : 터미널 시작 

tab : 자동완성 
tab tab : 자동완성 후보목록

파일 생성/삭제
touch [파일명] : 생성
rm [파일명] : 삭제

디렉토리 생성/제거
mkdir [디렉토리명] : a b c 등 디렉토리 여러개 생성 가능 
-p : 디렉토리 하위메뉴까지 모두 생성 
     ex) mkdir -p ./aaa/bbb/ccc/dd
rmdir [디렉토리명] : 디렉토리 삭제 (파일있으면 삭제가 되지 않음)
rm -r [경로] : 사용하면 디렉토리 내부 파일까지 모두 한꺼번에 삭제
rm -r./* : 현재디렉토리에서 전체 삭제 (내부에 있는 파일 전부삭제)

파일 이동 )
mv [파일] [옮길 곳] : 파일 이동
mv [파일] [파일이름] : 이름 변경 

파일 복사 ) 
cp [파일] [경로] : 
-r 옵션 : 디렉토리 복사하기

  ex) cp abc1 ./abc2 :  파일 abc1을 현재디렉토리의 새파일 abc2로 만들어 복사함 

패키지 다운) 
sudo apt install [패키지 이름]
apt show [패키지 이름] : 패키지 정보 확인 
   * apt는 설치에 필요한 의존 패키지들을 자동으로 설치 해좀 

패키지 삭제)
sudo apt purge [패키지 이름]



텍스트 편집기 ) 
설치 : sudo apt install vim -y 
파일열기 : vi [텍스트명]
------------------------
편집모드 진입 : i 버튼
편집모드 종료 : esc 버튼
저장         :     :w  (반드시 편집모드에서 나와서 수행해야 함)
그냥 종료 :     :q  (:q! 는 저장안하고 강제종료)
저장후 종료:   :wq
---------------------------
이후 텍스트 출력하기 : cat [텍스트명]
----------------------------------
텍스트 내에서 이동하기))
 * 반드시 편집모드 탈출 한 후 실행 !!
 G : 맨 아랫줄로 이동
gg : 맨 윗줄로 이동
dd : 한 줄 삭제  (100dd : 100줄 삭제)
$ : 문장 맨끝
:   : command line활성화 
v  :  비주얼 모드 진입

visual mode)
 command 모드에서 v눌러 visual 모드 진입 
영역선택 : ctrl 후 방향키 움직여 블록 잡기 
복사하기 : y   영역선택 한 채로    (yy : 한줄 복사)
붙여넣기 : p   커서 뒤쪽에  

command mode에서 )
undo : u
redo : ctrl + r

단어 찾기)
command mode에서 
/찾을단어  : 단어찾기 ()
다음 검색 : n
이전 검색 : N
단어 바꾸기)
:%s /찾을단어/바꿀단어/g  : 단어 바꿈 (g는 전역으로 전체단어를 바꾸는 옵션)


간단한 코딩 )
:set nu 라인 번호 나옴 
:set ts=4 탭사이즈
:set shiftwidth=4   탭을 space 4개로 자동변환
:set laststatus=2   status bar 추가 
* vi 껐다 켜면 설정 초기화 , 즉, 설정파일에 세팅 ! 
* .vimrc 로 환경설정파일 하나 만들어서 설정 가능 
 

*************************************************************
* 파일 디버깅 -> gcc로 가능 
gcc 다운로드 ) sudo apt install gcc -y
빌드 ) gcc [빌드할c파일명] -o [생성할결과파일명]
실행 ) [빌드 파일명]
    ex) ./gogo




* 쉘스크립트는 "자동화 작업"을 하기위해 필요 ** (명령어 for문으로 자동입력 등 )
쉘 스크립트 명령어 )) 
   echo  : 출력 명령어 _ 쉘스크립트 명령어(리눅스 명령어 X  bash 명령어 O)
 *  쉘 명령어 vs 쉘 스크립트 명령어는 다르다 !!!! 
   printenv : 쉘 스크립트의 시스템 전역변수 :쉘 명령어
 
쉘명령어 ) 
history : 이전 기록 확인   =>  확인후   !번호 입력하면 해당 shell이 나타남 
cat : 파일 내용 출력        =>  내용을 파일로 저장하는 법 : 명령어 뒤에  " > 저장할파일명.txt" 를 붙이면 파일로 저장됨  
find : 파일찾는 명령어     =>  ex) find [경로] -name "파일명"      +) "파일명" 대신 " *단어명* "은 해당 단어가 포함된 모든 파일, 디렉토리 찾기,  * 파일만 찾으려면 가장 뒤에 -type f, 디렉토리만 찾으려면 가장 뒤에 -type d
grep : 문자열 검색        =>  grep 문자열 ./파일명  : 파일내에서 문자열 검색 (문자열 있는 라인 한 줄 출력)
                                   =>  ls -al | grep .v     : 다른 명령어 출력결과에 문자열 검색하기 
* 왼쪽의 출력결과를 | 의 오른쪽으로 넘겨서 처리 한다. 
   ex) cat abc.txt | grep bbq


----------------------------------------------------------------------------------
리눅스 유저 추가 )
sudo adduser [계정명]
리눅스 유저 삭제 )
sudo deluser --remove-home [계정명]
리눅스 유저 확인 )
cat /etc/passwd | grep bash   :  | grep bash는 로그인 가능한 유저만 띄워줌 (로그인 가능한 사람은 로그인 후 bash가 바로 실행되도록 되어있어서)
사용자 전환 ) 
su [사용자명]     : 로그아웃 하는게 아니라 사용자 전환
exit          :  입력하면 다시 원래 사용자로 돌아옴 
* sudo su   : root계정으로 들어감 

-------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
char str[10]; // c 에서는 라이브러리 포함해도 string으로는 못 씀 
while (1) {
printf("SSAFY_ECHOBOT \n");
scanf("%s", str); // string scanf type은 %s ! 
if (strcmp(str, "exit") == 0 || strcmp(str, "bye") == 0) { // 그냥 str == "exit" 식으로는 문자열 비교 안됨 !!! 
break;
}
else
printf("%s \n", str);
}
return 0;
}

--------------------------------------------------------------------------

Shell 명령어 수행하기 )
- 자동화 -   bash를 실행시킨 후 shell명령어를 수행함 

1.  .c 파일 만들어 
2.  #include<stdlib.h>  반드시 포함,
3.  system함수 사용 ex) system("하고싶은쉘명령어");
4.  나머지 c 파일 형태와 같이 만들기
5.  gcc 함수로 빌드   ex) gcc ./파일명 -o ./빌드할파일명
6.  빌드한 파일 실행 

쉘명령어 )
* dmesg : (system diagnostic message:시스템진단메시지)
              사용했던 커널 메시지를 모두 출력하는 쉘 명령어
* date : 현재시간 확인 
* uptime : 현재시간, 시스템 시간, 커널부팅된 후 지난 시간 출력
              (접속자 수, cpu부하율(1분,5분, 15분 평균치)도 출력)

-------------------------------------------------------------------------

 * c언어에서 표준입력, 출력, 에러 장치는 stdout 
      stdout : 모니터와 연결 - printf
      stdin   : 키보드, 마우스와 연결 - scanf getche, getch 
      stderr  : 모니터와 연결 
     * 위 모든 걸 정의한 파일 : #include<stdout.h>
리눅스 : 다중사용자 컨셉 

---------------------------------------------------------------------------

심볼릭 링크 )
ln -s (파일) (링크이름) : 심볼릭링크 만들기

--------------------------------------------------------------------------------
#pragma once 
표준 아님 !!! : 헤더파일 중복되면 오류 뜨는데, 그걸 막아줌 

???파일 입출력 정리 

클러스터 : 하드디스크의 최소사이즈 4kB
----------------------------------------------------------------------------------

스케줄링 )

라운드 로빙 ?  : 1,2,3,4를 그냥 차례로 순회하며 loop 
                       형평성에서 good but 효율 ↓

dangling pointer : 프로세스가 아님 !!! 포인터의 포인터 연결을 정리하려면, 연결 차례로 
                         해제해야 하는데, 중간 포인터가 중단되면, 마치 좀비프로세스 같이 
해제 안된 포인터에 접근할 방법이 없음 .(메모리 깔끔하게 정리하려면 free를 잘하자)

-------------------------------------------------------------------------

시스템 정보확인)
lscpu
lsmem
lsscsi
lsusb

배포판 정보 확인)
cat /etc/os-release 
lsb_release -a

커널 버전 확인)
cat /proc/vrsion 

* 32비트 리눅스 18.04 LTS 버전부터 지원안함 

디스크 용량확인)
du -h 디렉토리명


------------------------------------------------------------------------------

네트워크))

ip 주소 확인)
i) ip addr
ii) ifconfig   =>net-tools 패키지 설치 필요 : sudo apt install net-tools

NIC)
-네트워크 인터페이스 카드(Network Interface Card)
: 네트워크 설정, 네트워크 카드 정보를 포함한 연결 통로, 인터페이스 
- lo : 가상 루프백 넽트워크 인터페이스 (Loopback Network Interface)
: 이 인터페이스에 신호를 보내면, 랜카드 밖으로 신호가 나가지 않고, 
본인에게 신호를 보내서 받은것 처럼 처리하게 됨 (그래서 루프백)

--------------------------------------------------------------------------------------

프로세스))

disk로 부터 메모리에 적재되어 '실행중인 프로그램'
이를 cpu가 차례로 가져가며 수행함 

- 커널쓰레드 & User Level 프로세스 : 두개로 나뉨 

프로세스확인)
ps aux      (User Level 프로세스 만 출력)
ps -e    (커널 쓰레드    만 출력 )

- Foreground 프로세스, Background 프로세스 
     상호 작용                user와 독립적으로 실행 

* 명령어에 & 넣으면, background 프로세스로 동작 
    => 더이상 '상호작용'이 불가능해짐  
     ex) vi & 
or vi 수행한 후 crtl+z 사용 
* forground로 다시 background를 꺼내오기 
    fg  명령어 입력 (가장 최근에 background로 이동한 프로세스부터 차례로 꺼내온다)


/var/tmp/test1.swp
/tmp/test1.swp
/var
-------------------------------------------------------------------
shell 스크립트 ) 

shell 스크립트 파일 생성 ) 
1. vi 파일명.sh 로 생성
2. 최상단에 #!/bin/sh 입력
3. 쉘명령어 입력 (출력은 echo)
shell 스크립트 파일 생성 ) 
4. . 파일명.sh 로 실행 
 또는 source 파일명.sh
 또는 bash 파일명.sh

echo 출력명령어 
read 입력명령어 ex) read input 하면 input 변수에 답이 저장됨 
${input} 입력받은 변수 내용을 그대로 사용   _ 정규식
sleep 1  : 1초쉬기
clear

* 모든 값들은 문자열 취급 
* 변수명=100   등 쓸 때 띄어쓰기 하면 오류 !!!!!!!

argument) 
.sh 파일 실행명령어 뒤에 알맞는 숫자의 변수 넣으면 자동입력 받음
ex) source quest.sh 100 200 50
* 사용은 그냥 입력 받을 필요없이 바로 $아무변수명 하고 쓰면됨

사칙연산 ) 
변수명 = `expr $다른변수명 + 75`
* 만약 #!/bin/bash 썼으면 echo $((15+35)) 이런식으로 그냥 사용 가능 , 띄어쓰기도 가능 !! 

주석) 
#뒤에하고싶은말

if 문) 
ex) if [ $a == $b ]
    then 
    elif []
    else
    fi

bash))
printf "어쩌구 %d \n" $a
배열) arr=(10 20 30 40)
       echo ${arr[0]}
for문) 
ex) for ((i=0;i<10;i++))
     do 
     done

함수) 
선언 : abc(){     }
실행 : abc