Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash에 대한 시스템 관리자 가이드

각 거래에는 해당 거래에서 가장 자주 사용하는 도구가 있습니다. 많은 시스템 관리자에게 해당 도구는 셸입니다. 대부분의 Linux 및 기타 Unix 계열 시스템에서 기본 셸은 Bash입니다.

Bash는 1980년대 후반에 시작된 상당히 오래된 프로그램이지만 C 셸(csh)과 같이 훨씬 더 오래된 셸을 기반으로 합니다. 쉘의 개념이 너무 오래되었기 때문에 시스템 관리자나 여자의 삶을 훨씬 쉽게 만들기 위해 소비되기를 기다리고 있는 엄청난 양의 신비한 지식이 있습니다.

몇 가지 기본 사항을 살펴보겠습니다.

어떤 시점에서 의도하지 않게 루트로 명령을 실행하여 문제를 일으킨 사람은 누구입니까? 손 들기

나는 우리 중 많은 사람들이 한 번에 그 남자 또는 여자 였을 것이라고 확신합니다. 매우 고통스러운. 다음은 그 돌을 두 번째로 치지 않도록 하는 몇 가지 아주 간단한 트릭입니다.

별칭 사용

먼저 mv와 같은 명령에 대한 별칭을 설정합니다. rm mv -I를 가리킵니다. 및 rm -I . 이렇게 하면 rm -f /boot 실행이 최소한 확인을 요청합니다. Red Hat Enterprise Linux에서 이러한 별칭은 루트 계정을 사용하는 경우 기본적으로 설정됩니다.

일반 사용자 계정에도 이러한 별칭을 설정하려면 이 두 줄을 홈 디렉토리의 .bashrc라는 파일에 놓기만 하면 됩니다(sudo에서도 작동함).

alias mv='mv -i'
alias rm='rm -i'

루트 프롬프트를 눈에 띄게 만들기

사고를 방지하기 위해 할 수 있는 또 다른 일은 루트 계정을 사용할 때 이를 알고 있는지 확인하는 것입니다. 저는 일반적으로 일상적인 작업에 사용하는 프롬프트에서 루트 프롬프트를 눈에 띄게 하여 그렇게 합니다.

루트의 홈 디렉토리에 있는 .bashrc 파일에 다음을 드롭하면 검은색 바탕에 빨간색으로 표시된 루트 프롬프트가 표시되어 사용자(또는 다른 사람)가 주의 깊게 밟아야 함을 분명히 알 수 있습니다.

export PS1="\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]"

사실, 가능한 한 root로 로그인하지 말고 sudo를 통해 대부분의 sysadmin 명령을 실행해야 하지만 이는 다른 이야기입니다.

루트 계정 사용의 "의도하지 않은 부작용"을 방지하는 데 도움이 되는 몇 가지 사소한 트릭을 구현한 후 Bash가 일상 업무에서 수행할 수 있는 몇 가지 좋은 작업을 살펴보겠습니다.

기록 관리

Bash에서 위쪽 화살표 키를 누르면 이전 명령을 모두 보고 재사용할 수 있다는 것을 알고 있을 것입니다. 이는 해당 명령이 홈 디렉토리의 .bash_history라는 파일에 저장되었기 때문입니다. 이 기록 파일에는 매우 유용할 수 있는 많은 설정과 명령이 포함되어 있습니다.

먼저 history를 입력하여 전체 최근 명령 기록을 볼 수 있습니다. 또는 history 30을 입력하여 마지막 30개 명령으로 제한할 수 있습니다. . 그러나 그것은 꽤 바닐라입니다. Bash가 저장하는 항목과 저장 방법을 더 잘 제어할 수 있습니다.

예를 들어, .bashrc에 다음을 추가하면 공백으로 시작하는 모든 명령이 기록 목록에 저장되지 않습니다.

HISTCONTROL=ignorespace

이것은 암호를 일반 텍스트로 명령에 전달해야 하는 경우에 유용할 수 있습니다. (예, 그것은 끔찍하지만 여전히 발생합니다.)

자주 실행되는 명령을 기록에 표시하지 않으려면 다음을 사용하십시오.

HISTCONTROL=ignorespace:erasedups

이렇게 하면 명령을 사용할 때마다 이전에 발생한 모든 항목이 기록 파일에서 제거되고 마지막 호출만 기록 목록에 저장됩니다.

내가 특히 좋아하는 기록 설정은 HISTTIMEFORMAT입니다. 환경. 이렇게 하면 기록 파일의 모든 항목 앞에 타임스탬프가 추가됩니다. 예를 들어 다음을 사용합니다.

HISTTIMEFORMAT="%F %T  "

history 5를 입력하면 , 다음과 같이 훌륭하고 완전한 정보를 얻습니다.

1009  2018-06-11 22:34:38  cat /etc/hosts
1010  2018-06-11 22:34:40  echo $foo
1011  2018-06-11 22:34:42  echo $bar
1012  2018-06-11 22:34:44  ssh myhost
1013  2018-06-11 22:34:55  vim .bashrc

덕분에 내 명령 기록을 탐색하고 이틀 전에 집 연구실에 대한 SSH 터널을 설정하는 데 사용한 명령을 찾는 것이 훨씬 쉬워졌습니다(이를 계속해서 잊어버리고...).

Bash 모범 사례

Bash 스크립트를 작성할 때 최고의(또는 적어도 좋은, 전지전능함을 주장하지는 않음) 사례의 상위 11개 목록으로 이 글을 마무리하겠습니다.

  1. Bash 스크립트는 복잡해질 수 있고 주석은 저렴할 수 있습니다. 댓글을 추가할지 고민이라면 댓글을 추가하세요. 주말 이후에 돌아와서 지난 금요일에 무엇을 하려고 했는지 파악하느라 시간을 보내야 한다면 댓글을 추가하는 것을 잊은 것입니다.

  1. ${myvariable}와 같이 모든 변수 이름을 중괄호로 묶습니다. . 이것을 습관화하면 ${variable}_suffix와 같은 것들이 만들어집니다. 가능하고 스크립트 전체에서 일관성을 향상시킵니다.
<올 시작="9">
  • 표현식을 평가할 때 역따옴표를 사용하지 마십시오. $() 사용 대신 구문. 따라서 다음을 사용하세요.
    for  file in $(ls); do

    아닙니다

    for  file in `ls`; do

    전자의 옵션은 중첩 가능하고 읽기 쉬우며 일반 시스템 관리자를 만족스럽게 유지합니다. 역따옴표를 사용하지 마십시오.

    1. 일관성이 좋습니다. 일을 하는 한 가지 스타일을 선택하고 스크립트 전체에서 이를 고수하십시오. 분명히 사람들이 $() 백틱에 대한 구문을 사용하고 변수를 중괄호로 묶었습니다. 탭이 아닌 2~4개의 공백을 사용하여 들여쓰기를 하면 좋겠지만, 잘못 선택하더라도 일관되게 잘못하십시오.
    <올 시작="7">
  • Bash 스크립트에 적절한 shebang을 사용하십시오. Bash로만 실행할 의도로 Bash 스크립트를 작성하면서 #!/usr/bin/bash를 가장 자주 사용합니다. 내 shebang으로. #!/bin/sh를 사용하지 마세요. 또는 #!/usr/bin/sh . 스크립트는 실행되지만 호환성 모드에서 실행되며 의도하지 않은 많은 부작용이 있을 수 있습니다. (물론 호환 모드가 원하는 것이 아닌 한.)
    1. 문자열을 비교할 때 if 문에서 변수를 인용하는 것이 좋습니다. 변수가 비어 있으면 Bash에서 다음과 같은 행에 대해 오류가 발생하기 때문입니다.
      if [ ${myvar} == "foo" ]; then
        echo "bar"
      fi

      그리고 다음과 같은 줄에 대해 false로 평가됩니다.

      if [ "${myvar}" == "foo" ]; then
        echo "bar"
      fi  

      또한 변수의 내용이 확실하지 않은 경우(예:사용자 입력을 구문 분석할 때) 변수를 인용하여 일부 특수 문자의 해석을 방지하고 변수가 공백을 포함하더라도 단일 단어로 간주되는지 확인하십시오.

    1. 이것은 취향의 문제지만 이중 등호(== ) Bash에서 문자열을 비교할 때도 마찬가지입니다. 일관성의 문제이며, 문자열 비교의 경우에만 단일 등호가 작동하더라도 내 마음은 즉시 "단일 등호는 할당 연산자입니다!"라고 생각합니다.
    <올 시작="4">
  • 적절한 종료 코드를 사용합니다. 스크립트가 어떤 작업을 수행하는 데 실패하면 사용자에게 서면 실패 메시지(문제를 해결하는 방법이 바람직함)를 표시하고 0이 아닌 종료 코드를 보내야 합니다.
    # we have failed
    echo "Process has failed to complete, you need to manually restart the whatchamacallit"
    exit 1

    이렇게 하면 다른 스크립트에서 프로그래밍 방식으로 스크립트를 호출하고 성공적인 완료를 확인하는 것이 더 쉬워집니다.

  • <올 시작="3">
  • Bash의 기본 제공 메커니즘을 사용하여 변수에 정상적인 기본값을 제공하거나 정의할 것으로 예상하는 변수가 정의되지 않은 경우 오류를 발생시킵니다.
    # this sets the value of $myvar to redhat, and prints 'redhat'
    echo ${myvar:=redhat}
    # this throws an error reading 'The variable myvar is undefined, dear reader' if $myvar is undefined
    ${myvar:?The variable myvar is undefined, dear reader}
  • <올 시작="2">
  • 특히 큰 스크립트를 작성하는 경우, 특히 다른 사람과 함께 큰 스크립트를 작성하는 경우에는 local 함수 내에서 변수를 정의할 때 키워드. local 키워드는 해당 함수 내에서만 볼 수 있는 지역 변수를 생성합니다. 이는 충돌하는 변수의 가능성을 제한합니다.
  • <올 시작="1">
  • 모든 시스템 관리자는 때때로 콘솔에서 무언가를 디버그해야 합니다. 데이터 센터의 실제 디버그 또는 가상화 플랫폼을 통한 가상 디버그입니다. 그런 식으로 스크립트를 디버깅해야 하는 경우 다음을 기억해 주셔서 감사합니다. 스크립트의 줄을 너무 길게 만들지 마십시오!



    많은 시스템에서 콘솔의 기본 너비는 여전히 80자입니다. 콘솔에서 스크립트를 디버그해야 하고 해당 스크립트에 줄이 매우 긴 경우 슬픈 팬더가 될 것입니다. 게다가, 더 짧은 줄이 있는 스크립트(기본값은 여전히 ​​80자임)는 일반 편집기에서도 훨씬 더 읽기 쉽고 이해하기 쉽습니다!
  • 저는 배쉬를 진심으로 사랑합니다. 나는 그것에 대해 글을 쓰거나 동료 애호가들과 멋진 트릭을 교환하는 데 몇 시간을 보낼 수 있습니다. 댓글에 즐겨찾기를 남겨주세요!