Skip to content

#90DaysOfDevOps - Linux Commands for DevOps (Actually everyone) - Day 15

데브옵스(실제로는 모든 사용자)를 위한 Linux 명령

어제 터미널에서 몇 가지 명령을 사용하여 작업을 수행하는 데 많은 시간을 할애하게 될 것이라고 언급했습니다.

또한 vagrant 프로비저닝된 VM을 사용하면 vagrant ssh를 사용하여 box에 액세스할 수 있다고도 언급했습니다. 프로비저닝한 디렉토리와 동일한 디렉토리에 있어야 합니다.

SSH의 경우 username과 password는 필요하지 않으며, 가상 box 콘솔에 로그인하려는 경우에만 필요합니다.

아래는 우리가 원하는 위치입니다:

명령어들

여기서 다루지 않은 명령어도 있습니다. 이러한 명령어를 다루는 문서 페이지가 있지만, 특정 명령에 대한 옵션을 이해해야 할 때는 man 페이지를 사용할 수 있습니다. man 페이지를 사용하면 이 글에서 다루는 각 명령어에 대한 더 많은 옵션을 찾을 수 있습니다. man man을 실행하면 man 페이지에 대한 도움말을 볼 수 있습니다. Q를 눌러 매뉴얼 페이지를 종료할 수 있습니다.

Windows에서 관리자 권한으로 실행을 마우스 오른쪽 버튼으로 클릭으로 하는 것에 익숙하다면, sudo 명령어를 비슷하게 생각할 수 있습니다. 이 명령어를 사용하면 명령을 root 권한으로 실행하며, 명령 실행 전에 암호를 입력해야 하는 메시지가 표시됩니다.

일회성 작업이 아니라 여러 작업을 수행하며 일시적으로 sudo 권한을 유지하려면 어떻게 해야 할까요? sudo su를 사용하면 sudo와 동일한 권한을 가질 수 있습니다. 그러나 이 방법은 보안상 위험할 수 있습니다. root 권한을 오랜 시간 동안 유지하는 것은 위험하기 때문입니다. 테스트 VM에서는 문제가 되지 않을 수 있지만 실제 서버에서는 위험할 수 있습니다. 따라서 작업을 마치면 exit를 입력하여 root 권한을 해제해야 합니다.

저는 항상 clear 명령어를 사용합니다. 이 명령어는 이전 명령의 출력 화면을 모두 지우고 깔끔한 작업 공간을 제공하기 때문에 프롬프트를 맨 위에 위치시키는 것과 같은 효과를 가집니다. 윈도우 운영체제에서는 이 명령어를 cls로 사용할 수 있습니다.

이제 시스템 내에서 무언가를 생성한 후에 터미널에서 시각화할 수 있는 몇 가지 명령어를 살펴보겠습니다. 먼저 mkdir 명령어를 사용하여 시스템에 폴더를 생성할 수 있습니다. 예를 들어, 홈 디렉토리에 Day15라는 폴더를 생성하려면 mkdir Day15 명령어를 사용하면 됩니다.

cd를 사용하면 디렉토리를 변경할 수 있으므로, 새로운 디렉토리로 이동하려면 cd D에서 탭을 사용하여 cd Day15 같이 가능한 디렉토리를 자동 완성할 수 있습니다. 시작 위치로 돌아가려면 cd ..을 사용하면 됩니다.

rmdir 명령어를 사용하면 디렉토리를 삭제할 수 있습니다. 예를 들어, rmdir Day15 명령어를 실행하면 폴더가 삭제됩니다.(단, 해당 폴더가 비어있을 경우에만 작동합니다.)

가끔 파일 시스템의 깊은 곳에서 디렉토리를 찾았지만, 그 위치를 모르는 경우가 있습니다. pwd 명령어는 작업 디렉토리의 경로를 출력해주는데, 비밀번호처럼 보이지만 실제로는 "print working directory"의 약자입니다.

폴더와 디렉토리를 만드는 방법은 알고 있지만, 파일을 만드는 방법은 어떨까요? 파일을 생성하는 방법 중 하나는 touch 명령을 사용하는 것입니다. 예를 들어, touch Day15 명령을 실행하면 파일이 생성됩니다. mkdir 명령은 이후에 살펴볼 예정이므로, 지금은 무시하셔도 됩니다.

현재 디렉토리 내 모든 파일과 폴더를 나열하려면 ls 명령을 반복해서 사용해야 할 것입니다. 해당 명령어로 방금 생성한 파일이 있는지 확인해보겠습니다.

우리는 리눅스 시스템에서 어떻게 파일을 찾을 수 있을까요? locate 명령어를 사용하면 파일 시스템을 검색할 수 있습니다. 만약 locate Day15와 같이 입력하면 해당 파일의 위치를 알려줍니다. 또한, 파일이 존재하는데 검색 결과가 없다면 sudo updatedb 명령어를 실행하여 파일 시스템의 모든 파일을 인덱싱한 후 다시 locate 명령어를 실행하세요. 만약 locate 명령어가 없다면 sudo apt install mlocate 명령어를 사용하여 설치할 수 있습니다.

리눅스 시스템에서 파일을 찾으려면 어떻게 해야 할까요? mv 명령어를 사용하면 파일을 이동할 수 있습니다. 예를 들어, mv Day15 90DaysOfDevOps 명령어는 Day15 파일을 90DaysOfDevOps 폴더로 이동시킵니다.

파일을 옮겼는데, 이름을 변경하고 싶다면 어떻게 해야 할까요? 이름을 변경하려면 mv 명령어를 다시 사용하면 됩니다. 예를 들어, 대소문자를 변경하려면 mv Day15 day15와 같이 입력하고, 파일 이름을 완전히 바꾸려면 mv day15 AnotherDay와 같이 입력하면 됩니다. 변경 후에는 ls 명령어를 사용하여 파일이 정상적으로 변경되었는지 확인할 수 있습니다.

이제 파일과 디렉토리가 생성되면 디렉토리를 삭제해 보겠습니다. 파일을 삭제하려면 간단히 rm AnotherDay 명령어를 사용할 수 있습니다. 폴더를 재귀적으로(하위 폴더까지) 삭제하려면 rm -R 명령어를 사용하는 것이 일반적입니다. 또한, rm -R -f 명령어를 사용하여 해당 파일을 강제로 삭제할 수도 있습니다. 시스템과 영원한 작별 인사를 하고 싶다면 sudo rm -R -f /를 입력하면 됩니다.(주의: 이 명령어는 시스템을 완전히 삭제합니다. - 옮긴이)

파일 이동에 대해 살펴봤는데, 한 폴더에서 다른 폴더로 파일을 복사하고 싶을 때는 mv 명령어 대신 cp 명령어를 사용해야 합니다. 이제 cp Day15 Desktop으로 파일을 복사할 수 있습니다.

폴더와 파일을 만들었지만, 폴더에는 아직 내용이 없습니다. 내용을 추가하는 몇 가지 방법이 있지만, 가장 쉬운 방법은 echo를 사용하는 것입니다. echo를 사용하면 터미널에서 많은 내용을 출력할 수 있습니다. 저는 시스템 변수가 설정되어 있는지를 확인하기 위해 시스템 변수를 출력할 때 echo를 자주 사용합니다. 파일에 내용을 추가하려면 echo "Hello #90DaysOfDevOps" > Day15를 사용할 수 있습니다. 또는 echo "Commands are fun!" >> Day15를 사용할 수도 있습니다.

cat은 매우 자주 사용하는 명령어 중 하나입니다. cat은 "concatenate(연결)"의 약어로, cat Day15 명령어를 사용하여 파일 내용을 확인할 수 있습니다. 이 명령어는 구성 파일을 빠르게 읽을 때 유용합니다.

복잡한 구성 파일에서 모든 줄을 읽는 대신에, 특정한 단어를 찾고 싶거나 찾아야 하는 경우 grep을 사용할 수 있습니다. 예를 들면 cat Day15 | grep "#90DaysOfDevOps"를 입력하여 파일에서 원하는 단어를 검색할 수 있습니다. 이렇게 하면 빠르게 결과를 얻을 수 있습니다.

제가 clear 명령을 자주 사용하여 이전에 실행한 일부 명령을 놓칠 수 있기 때문에, history 명령을 사용하여 이전에 실행한 모든 명령을 찾을 수 있습니다. history -c 명령은 기록을 제거합니다.

history를 실행하고 특정 명령을 선택하려는 경우 !3을 사용하여 목록에서 세 번째 명령을 선택할 수 있습니다.

또한 history | grep "Command"를 사용하여 특정 명령을 검색할 수도 있습니다.

서버에서 명령이 언제 실행되었는지 추적하려면 히스토리 파일의 각 명령에 날짜와 시간을 추가할 수도 있습니다.

다음 시스템 변수가 이 동작을 제어합니다:

HISTTIMEFORMAT="%d-%m-%Y %T "

bash_profile에 쉽게 추가할 수 있습니다:

echo 'export HISTTIMEFORMAT="%d-%m-%Y %T "' >> ~/.bash_profile

히스토리 파일을 더 크게 만들 수도 있습니다:

echo 'export HISTSIZE=100000' >> ~/.bash_profile
echo 'export HISTFILESIZE=10000000' >> ~/.bash_profile

비밀번호를 변경해야 하나요? passwd 명령어를 사용하여 비밀번호를 변경할 수 있습니다. 비밀번호가 숨겨져 있을 때는 이 명령어를 실행해도 history에 표시되지 않지만, 명령에 -p PASSWORD가 포함되면 history에 표시됩니다.

새로운 사용자를 시스템에 추가하고 싶을 경우 sudo 명령어를 사용하여 sudo useradd NewUser를 입력해야 합니다.

그룹을 재생성하려면 sudo 권한이 필요합니다. sudo groupadd DevOps 명령을 사용하여 새로운 사용자를 해당 그룹에 추가하려면 sudo usermod -a -G DevOps 명령을 실행하세요. -a는 추가를, -G는 그룹 이름을 나타냅니다.

sudo 그룹에 새로운 사용자를 추가하는 것은 드물기는 하지만, 이를 위해서는 usermod -a -G sudo NewUser 명령어를 입력하면 됩니다.

권한

읽기, 쓰기, 실행 권한은 Linux 시스템의 모든 파일과 폴더에 대한 권한입니다.

전체 목록입니다:

  • 0 = 없음 ---
  • 1 = 실행만 --X
  • 2 = 쓰기만 -W-
  • 3 = 쓰기 및 실행 -WX
  • 4 = 읽기 전용 R--
  • 5 = 읽기 & 실행 R-X
  • 6 = 읽기 및 쓰기 RW-
  • 7 = 읽기, 쓰기 및 실행 RWX

또한 777 또는 775로도 표시되며 이는 위 목록과 동일한 숫자를 나타내지만 각각 User - Group - Everyone을 나타냅니다.

파일을 살펴봅시다. ls -al Day15를 실행하면 위에서 언급한 3개의 그룹을 볼 수 있으며, 사용자와 그룹은 읽기 및 쓰기 권한을 가지고 있지만 모두 읽기 권한만 있습니다.

시스템에서 많은 양의 바이너리를 생성하고 실행할 수 있는 기능을 제공해야 한다면, chmod를 사용하여 해당 바이너리에 대한 권한을 변경할 수 있습니다. 예를 들어, chmod 750 Day15 명령어를 실행하면 Day15 파일에 대한 권한을 설정할 수 있으며, ls -al Day15 명령어로 권한이 설정되었는지 확인할 수 있습니다. 전체 폴더에 대해 이 작업을 실행하려면 -R 옵션을 사용하여 재귀적으로(하위 폴더까지) 설정할 수 있습니다.

파일 소유자를 변경하는 것은 어떨까요? 이 작업에는 chown을 사용할 수 있습니다. Day15의 소유권을 사용자 vagrant에서 NewUser로 변경하려면 sudo chown NewUser Day15를 다시 -R로 실행할 수 있습니다.

특정 데이터만 필요한 출력을 얻을 때, 실제로 사용되는 명령어는 awk입니다. 예를 들어, who를 실행하면 정보가 포함된 줄을 얻을 수 있지만, 이름만 필요한 경우도 있습니다. 이때는 who | awk '{print $1}'를 실행하여 첫 번째 열에 해당하는 이름 목록만 가져올 수 있습니다.

데이터 스트림을 표준 입력에서 읽으려면 커맨드라인을 생성하고 실행해야 합니다. 이렇게 하면 명령의 출력을 가져와 다른 명령의 인수로 전달할 수 있습니다. 이러한 사용 사례에 유용한 도구로 xargs가 있습니다. 예를 들어, 실행 가능한 시스템에서 모든 Linux 사용자 계정의 목록을 가져오고 싶다면, cut -d: -f1 < /etc/passwd를 실행하면 아래와 같은 긴 목록이 생성됩니다.

이 목록을 압축하려면 cut -d: -f1 < /etc/passwd | sort | xargs와 같은 명령을 사용하면 됩니다. xargs를 추가로 사용합니다.

이미 언급된 것은 아니지만, cut 명령어는 파일에서 각 줄의 섹션을 제거하는 데 사용할 수 있습니다. 이 명령어는 바이트 위치, 문자 또는 필드 단위로 줄의 일부를 잘라내는 데 사용됩니다. 예를 들어, cut -d " " -f 2 list.txt 명령어를 사용하면 첫 글자를 제거하고 숫자만 표시할 수 있습니다. 많은 조합이 있기 때문에 수동으로 데이터를 추출하는 것보다 이 명령어를 사용하는 것이 더 빠를 수 있습니다.

명령을 입력을 멈추고 때는 컨트롤 + C를 누르면 해당 줄이 취소되고 새로 시작됩니다.

자료

Day 16에서 봐요!

목록이 꽤 길지만, 리눅스 서버를 관리하거나 리눅스 데스크톱에서 작업하는 등 일상에서 이 명령어를 모두 활용한다고 자신 있게 말할 수 있습니다. Windows나 macOS에서는 UI를 탐색하는 것이 간단하지만, 터미널을 통해 모든 것이 이루어지는 Linux 서버에서는 그렇지 않습니다.