GN⁺: Shellcheck이 여러분의 쉘 스크립트에서 버그를 찾아냅니다
(shellcheck.net)ShellCheck 소개
- ShellCheck는 쉘 스크립트의 버그를 찾아주는 도구임.
- 로컬 환경에서 cabal, apt, dnf, pkg, brew를 통해 설치 가능함.
- 스크립트를 붙여넣으면 ShellCheck가 분석 결과를 출력함.
ShellCheck의 특징
- ShellCheck는 GPLv3 라이선스로 자유롭게 사용할 수 있음.
- ShellCheck Wiki에 문서화되어 있고, GitHub에서 소스 코드를 확인할 수 있음.
- 대부분의 배포판이나 패키지 매니저에서 이미 패키징되어 있음.
- 주요 에디터에서 통합된 린터로 지원되며, CodeClimate, Codacy, CodeFactor를 통해 GitHub 저장소의 코드를 자동으로 검사할 수 있음.
- Haskell 언어로 작성되었으며, 이에 관심이 있는 사용자에게 적합함.
감사의 말
- GitHub Sponsors에 대한 특별한 감사를 표함: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez 등.
GN⁺의 의견
- 이 기사에서 가장 중요한 것은 ShellCheck가 쉘 스크립트의 버그를 찾는 데 유용한 도구라는 점임.
- ShellCheck는 무료이며, 다양한 플랫폼과 에디터에서 지원되고, 사용하기 쉬운 점이 사람들에게 흥미로울 수 있음.
- 특히, 오픈 소스 커뮤니티의 지원과 Haskell 언어로 개발되었다는 점이 소프트웨어 개발자들에게 매력적으로 다가갈 수 있음.
Hacker News 의견
-
스크립트 작성 시 주의사항
-
-u
(nounset) 옵션을 사용하여 선언되지 않은 변수 사용 시 오류 발생을 권장함. 배열 확장 시 빈 배열이 unbound로 간주되는 경우가 예외임. -
-n
(noexec) 옵션을 사용하여 명령어 실행을 방지하는 가짜 실행(dry-run)을 시도할 수 있음. -
-e
(errexit) 옵션도 유용하지만, 실패한 "naked" 명령어만 종료를 유발한다는 점을 주의해야 함. 이를 피하기 위해 명령어에|| fail "..."
를 추가하는 것을 선호함.
-
-
쉘 스크립트의 취약점 발견
- 산술 확장을 통한 권한 상승 취약점을 발견함. 예를 들어,
$((1 + ENV_VAR))
를 통해 $ENV_VAR을 제어할 수 있다면 코드를 주입할 수 있음. - Shellcheck는 기본 설정으로는 이를 잡아내지 못함. 보안에 중요한 기능을 구현할 때는 쉘을 사용하지 않는 것이 좋음.
- 산술 확장을 통한 권한 상승 취약점을 발견함. 예를 들어,
-
Shellcheck와 strictbash
- Shellcheck는 매우 유용함.
- strictbash는 스크립트를 실행하기 전에 Shellcheck을 실행하는 래퍼(wrapper)로, 오류가 있으면 스크립트를 실행할 수 없게 함. 또한 모든 Bash "strict mode" 플래그를 설정함.
-
Shellcheck에 대한 언급
- Shellcheck에 대한 많은 언급이 있으며, 마지막 대규모 토론은 2021년에 있었음.
-
Haskell과 Turtle 사용
- Haskell을 사용하여 Turtle 라이브러리와 함께 배포 스크립트를 변환함으로써 중복을 크게 줄임.
- 결과적으로 코드가 훨씬 짧아짐.
-
Shellcheck와 linters의 사용
- "모든 경고를 수정한 후에 커밋한다"는 원칙을 따르며, Shellcheck 및 다른 linters를 pre-commit 설정에 포함함.
- 대부분의 쉘 스크립트는 .gitlab-ci.yml 파일에 포함되어 있어 검사하기 어려움. 이를 자동으로 검사하는 래퍼를 만듦.
-
Bash 언어 서버
- Bash 언어 서버도 존재함.
-
Shellcheck의 학습 효과
- Shellcheck를 사용하여 첫 번째 프로덕션 /bin/sh 스크립트를 검사했을 때, 80년대부터 스크립트를 작성해온 경험에도 불구하고 새로운 것을 배움.
-
Bach 사용 권장
- Bash를 사용해야 할 때 Bach를 사용하는 것을 권장함. 충분히 긴 작업에 대해 Bash를 사용하는 것은 적절하지 않을 수 있음.
-
Shellcheck와 소스/임포트 처리
- Shellcheck는 훌륭하지만, 소스나 임포트를 다루는 것은 매우 번거로움. 이는 sh가 악몽과 같기 때문에 발생하는 문제임.