스크립트를 사용하여 fstab에 noatime을 추가하는 방법은 무엇입니까?

스크립트를 사용하여 fstab에 noatime을 추가하는 방법은 무엇입니까?

서버를 설정하기 위해 bash 스크립트를 noatime추가 하고 싶습니다 .fstab

/파티션에 대해서만 안전한 방법으로 자동화하려면 어떻게 해야 합니까 ?

간단히 말해서:

해당 줄에 아직 bash/shell 코드를 사용하는 내용이 포함되어 있지 않은 경우 ,noatime두 번째 문자열을 해당 줄의 네 번째 문자열에 추가하려면 어떻게 해야 합니까?/noatime

예시 파일:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

얻어야 할 것:

# Comment
UUID=1234567890-abcdef    /     ext4  defaults,discard,noatime    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

답변1

이렇게 하면 원하는 효과를 얻을 수 있습니다.

awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab

이는 귀하가 요청한 것보다 조금 더 구체적입니다. 다음과 ,noatime같은 경우 네 번째 필드에 추가됩니다.그 분야아직 포함되지 않음 noatime, 전체 행을 확인하지 않습니다.

-i inplaceGawk에만 해당됩니다. 지원되지 않는 경우 결과는 새 파일에 기록됩니다.

awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}

두 경우 모두 서버 설정 스크립트가 루트로 실행되고 있다고 가정합니다.

(감사해요에드 모튼강력한 텍스트 교체를 위해 !를 사용할 때 네 번째 필드의 정규 표현식과 관련된 잠재적인 문제를 방지합니다 sub. )

답변2

$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef    /     ext4  defaults,noatime,discard    0    1
UUID=9876543210-fedcdab   /var  ext4  defaults,discard    0    0

정규식과 일치하는 줄 m:^[^#]+\s+/\s+: (예: 공백으로 둘러싸인 /아니요앞에 #주석이 있음) 및 일치하지 않으면 noatime삽입되는 줄을 수정합니다 ,noatime.

참고: 이는 ,noatime뒷면 defaults이 아닌 뒷면 에 삽입됩니다 discard. 내 생각에는 이것이 defaults거의 확실하게 존재하기 때문에( discard어쨌든 그것보다 더 가능성이 높음) 더 의미가 있다고 생각합니다.

이는 연습 실행을 수행합니다. 즉, 수정하지 않고 ./fstab표준 출력에 수행할 작업만 표시합니다. 실제로 파일을 수정하려면 Perl의 -i옵션을 사용하십시오.

perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

물론 ./fstab을 /etc/fstab으로 변경합니다.

atime그런데 , relatime, 등의 기존 인스턴스 도 변경하려면 nodiratime명령문을 추가하세요.첫 번째. 예를 들어

perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
  m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab

답변3

확장된 정규식 모드(-E)에서 실행되는 GNU sed를 사용하여 이 작업을 수행할 수 있습니다. 두 번째 필드가 단일 슬래시 "/"이고 네 번째 필드에 아직 전체 단어 "noatime"이 포함되어 있지 않은 줄을 확인한 다음 이를 네 번째 단어에 추가합니다.

sed -E -e '
  \:^\s*\S+\s+/\s:!b
  s/\S+/\n&\n/4
  /\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
  s/\n//g
' /etc/fstab

관련 정보