매개변수를 기반으로 bash 스크립트를 잠그시겠습니까?

매개변수를 기반으로 bash 스크립트를 잠그시겠습니까?

주어진 매개변수를 기반으로 스크립트를 잠그는 방법을 찾으려고 노력하고 있지만 정답을 찾지 못했습니다.

내가 달성하고 싶은 것은 다른 사용자가 특정 매개변수를 기반으로 스크립트를 실행하는 것을 방지하는 것입니다. 따라서 사용자 A가 매개변수 JOHN_DOE(예: -d JOHN_DOE)를 사용하여 스크립트를 실행하고 사용자 B가 매개변수를 사용하여 스크립트를 실행 -d ANNA_DOE하면 문제 없이 실행됩니다. user 사용자 B JOHN_DOE는 스크립트의 첫 번째 인스턴스 실행이 완료되지 않은 동안 B가 인수를 사용하여 실행을 시도할 때 이를 실행할 수 없습니다 .

이를 달성하는 올바른 방법이 있습니까?

답변1

이와 같은 도구는 flock잠금을 관리하는 데 도움이 될 수 있습니다. (문서나 실습을 신뢰하는지 여부에 따라 NFS에서는 작동하지 않을 수 있으며 SMB 또는 다른 원격 파일 시스템에서도 작동하지 않을 수 있습니다.)

설명서에는 man flock몇 가지 사용 예가 있습니다. 이것은 귀하의 상황에 맞는 것 중 하나입니다.

#!/bin/bash
# Example of using flock(1) to provide a named exclusive lock

# Parse command line options
while getopts 'd:' OPT
do
    case "$OPT" in
        d)      lockParam="$OPTARG" ;;
        *)      echo "Usage: ${0##*/} -d <parameter>" >&2; exit 1
    esac
done
shift $(($OPTIND -1))

# Sanitise lock parameter value (do not trust the user)
lockName="$(printf "%s\n" "${lockParam^^}" | tr -cd '[:alnum:]\n')"
lockFile="/tmp/lock.${##*/}.${lockName:-noname}"

echo "Attempting lock with parameter '$lockParam' sanitised to '$lockName'" >&2
(
    # Get the lock or report failure. See "man flock" for other options
    flock -n 9 || exit 9

    # This section is managed by the exclusive lock. Your program code
    # would go here.
    echo "Achieved exclusive lock on '$lockFile'" >&2

    sleep=10
    echo "Waiting for $sleep second(s) to simulate activity" >&2
    sleep $sleep

    # Exit status 0=ok, otherwise 1-8 is your choice of error codes
    echo "Releasing lock" >&2
    exit 0
    
    # End of exclusive lock section
) 9>"$lockFile"
ss=$?

# Report on exit status from actual code
if [ $ss -eq 9 ]
then
    echo "Failed to acquire lock" >&2
fi

# Exit with meaning
exit $ss

스크립트를 실행 가능하게 만든 다음(호출하는 경우 lockeg) chmod a+x lockeg실행하십시오.

./lockeg -d JOHN_DOE

답변2

"적절함"이 무엇을 의미하는지에 따라 다릅니다 ;-). "간단함"과 (상대적으로) "휴대 가능"을 의미하는 경우 다음을 수행할 수 있습니다.

만약에각 적법한 매개변수는 적법한 파일 이름이기도 합니다. 간단히 빈 파일을 만들어 잠금 파일로 사용할 수 있습니다. 물론 잠금 파일을 생성하는 것과 그 존재를 확인하는 것 사이에 간격이 없는지 확인해야 하지만 "적절한" 셸이 있으면 flock이 작업을 수행할 필요가 없습니다(그리고 일부 시스템에는 이 셸이 함께 제공되지 않습니다). ; 간단히 사용할 수 있습니다set -CBourne 쉘에 지시합니다.아니요.redirect 를 사용하여 출력을 리디렉션할 때 기존 파일을 덮어씁니다 >.

예를 들어:

#/bin/sh

# Your paramter.
param="${1?no parameter given}"

# Disallow overwriting files with '>'
set -C

# This will fail if the lockfile exists and create it if it doesn't.
# ':' is a no-op, the output of which is re-directed.
: >"${TMPDIR:-/tmp}/$param.lock"

#
# Do stuff ...
#

set -C"올바른"이란 다음 을 사용하여 구현된 쉘을 의미합니다.openO_EXCL다음을 포함한 대부분의 쉘에 대한 시스템 호출 플래그불다, 하다. 다음을 포함한 대부분의 운영 체제리눅스, 열려는 파일이 네트워크 파일 시스템에 상주하지 않는 한 플래그가 open설정된 호출이 원자성임을 보장합니다 .O_EXCL

법적 매개변수가 있는 경우아니요또한 유효한 파일 이름이므로 간단히 해시할 수 있습니다.

답변3

각 사용자와 허용된 매개변수가 포함된 파일을 사용하고, 사용자 이름을 확인하고, 일치하는 항목이 없으면 스크립트를 종료할 수 있습니다.

관련 정보