변수 값의 하이픈(bash)

변수 값의 하이픈(bash)

간단한 스크립트를 작성 중입니다.iptablesMAC 주소를 사용하여 액세스를 제한하세요. 먼저 주소가 스크립트에 전달되었는지 확인합니다.

ALLOWED_MAC=$5
MAC_STRING=""
if [ -n "$ALLOWED_MAC" ] ; then
    MAC_STRING="-m mac --mac-source ${ALLOWED_MAC}"
fi

그런 다음 MAC_STRING변수를iptables:

iptables -A INPUT -p $PROTOCOL --dport $PORT $MAC_STRING -m state --state NEW,ESTABLISHED -j ACCEPT

(물론) 전체에 대해 if/else를 수행할 수 있지만 이 솔루션이 더 깔끔해 보입니다. 사용자가 MAC 주소를 지정하면 해당 주소가 다음으로 전달됩니다.iptables, 그렇지 않으면 빈 문자열을 전달합니다.

그러나 이 스크립트를 실행하면 오류가 발생합니다.iptables:

iptables v1.4.9.1: Invalid match name " mac --mac-source 00:11:22:33:44:55" (28 chars max)

mfrom 앞의 하이픈/대시/빼기 기호가 MAC_STRING사라집니다. 그러나 예상되는 명령을 에코하면 모든 것이 올바르게 보입니다.

iptables -A INPUT -p tcp --sport 80  -m mac --mac-source 00:11:22:33:44:55 -m state --state ESTABLISHED -j ACCEPT

또한 동일한 결과로 다른 명령을 사용해 보았습니다. 하이픈으로 시작하는 변수 값이 있는 경우 프로그램에 인수로 전달되면 해당 값이 삼켜집니다.

답변1

좋아, @Gilles 덕분에 마침내 알아냈고 그는 나에게 올바른 방향을 알려줬습니다.

iptables/mac 스니펫은 함수 내부에 있습니다. 내 스크립트에서는 주어진 파일 세트를 반복하고 구문 분석한 다음 (각 파일에 대해) iptables 함수를 호출합니다.

IFS알고 보니 스크립트 상단을 변경하고 (파일 구문 분석을 단순화하기 위해) 스크립트의 나머지 부분도 변경되도록 했습니다. 그러나 이전 값을 먼저 저장한 IFS다음 각 호출 전에 이(이전 값)로 다시 설정하면 모든 것이 예상대로 작동합니다!

그래서 이거아니요일하다:

#!/bin/bash

function allow()
{
    [variable defs] 

    if [ -n "$ALLOWED_MAC" ] ; then
        MAC_STRING="-m mac --mac-source $ALLOWED_MAC"
    fi

    iptables -A INPUT -p $PROTOCOL --dport $PORT $MAC_STRING -m state --state NEW,ESTABLISHED -j ACCEPT
}

#Set the Internal Field Separator to the token used in the files.
IFS=";"

[variable defs]

#Iterate over all the port files.
for file in $FILES
do

#Read the first (and only) line from the current file and split the tokens into an array.
LINE="$(cat $file)"
set -- "$LINE" 
declare -a Tokens=($*) 

[parse tokens]

#Call 'allow' for each port definition.
allow $PROTOCOL $PORT $DIRECTION $ALLOWED_MAC

done

하지만 이것은 작동합니다:

#!/bin/bash

function allow()
{
    [variable defs]

    if [ -n "$ALLOWED_MAC" ] ; then
        MAC_STRING="-m mac --mac-source $ALLOWED_MAC"
    fi

    iptables -A INPUT -p $PROTOCOL --dport $PORT $MAC_STRING -m state --state NEW,ESTABLISHED -j ACCEPT
}

#Save the "original" IFS
OLD_IFS=$IFS

[variable defs]

#Iterate over all the port files.
for file in $FILES
do

#Set the Internal Field Separator to the token used in the files.
IFS=";"

#Read the first (and only) line from the current file and split the tokens into an array.
LINE="$(cat $file)"
set -- "$LINE" 
declare -a Tokens=($*) 

[parse tokens]

#Reset IFS before invoking the function.
IFS=$OLD_IFS

#Call 'allow' for each port definition.
allow $PROTOCOL $PORT $DIRECTION $ALLOWED_MAC

done

여기 복사/붙여넣기 과정에서 뭔가를 놓쳤을 수도 있지만 요점은 거기에 있었으면 좋겠습니다.

당신의 도움을 주셔서 감사합니다!

//앤더스

관련 정보