공백과 문자가 포함된 문자열을 말리시겠습니까? [복사]

공백과 문자가 포함된 문자열을 말리시겠습니까? [복사]

Unix/Mac 시스템용 문서를 생성하는 "간단한" 스크립트를 만들려고 합니다. 필요한 정보를 성공적으로 받았지만 정보 출력에 일부 공백과 문자가 제공되므로 CURL을 사용하여 생성된 웹 서버로 보낼 수 없는 것 같습니다. 나는 많은 것을 시도했지만 그 중 아무것도 작동하지 않는 것 같습니다.

다음은 스크립트가 컬에 보낼 URL 출력입니다.

"ip.ip.ip.ip/documentation/index.php?avdelning=XX&user=XXX&hostname=XXX&model=ModelName:MacminiModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2DuoProcessorSpeed:2.4GHzNumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=etherxx:xx:xx:xx:xx:xx&SERIALNUMBER=SerialNumber(system):XXXXXXXX&LASTLOGGEDIN=XXXXX

CURL을 사용하여 이 작업을 직접 수행하면 다음 문자열을 사용하면 작동하고 오류가 발생하지 않으며 웹 서버에서 정보를 받습니다.

하지만 스크립트를 사용하면 작동하지 않습니다. 스크립트:

#!/bin/bash

STR_RAM=$(/usr/sbin/system_profiler SPHardwareDataType | grep Memory: | sed 's/ //g');
STR_MODEL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Model | sed 's/ //g');
STR_CPUNAME=$(/usr/sbin/system_profiler SPHardwareDataType | grep Processor | sed 's/ //g');
STR_CPUCORES=$(/usr/sbin/system_profiler SPHardwareDataType | grep Cores: | sed 's/ //g');
STR_SERIAL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Serial | sed 's/ //g');
STR_MACADDR=$(ifconfig | grep en0 -A3 | grep ether | sed 's/ //g');
STR_LOGGEDIN=$(finger | tail -1 | sed 's/ //g');
STR_HOSTNAME=$(hostname | sed 's/ //g');

STR_URL=ip.ip.ip.ip/documentation/index.php?avdelning=$1\&user=$2\&hostname=$STR_HOSTNAME\&model=$STR_MODEL\&RAM=$STR_RAM\&CPU=$STR_CPUNAME\&CPUCORES=$STR_CPUCORES\&MACADDRESS=$STR_MACADDR\&SERIALNUMBER=$STR_SERIAL\&LASTLOGGEDIN=$STR_LOGGEDIN;


STR_URL2=$(echo $STR_URL | sed 's/ //g' | awk '{printf("\"%s\"\n", $0);}');
curl $STR_URL2;

보시다시피 sed와 awk를 사용하여 불필요한 편집 내용을 여러 개 추가했지만 아무 것도 작동하지 않는 것 같습니다.

다음 오류 메시지가 표시됩니다. awk를 추가하여 URL 문자열 앞뒤에 큰따옴표를 추가하면 다음과 같은 메시지가 표시됩니다.

Could not resolve "ip.ip.ip.ip

오류가 발생하지 않고 터미널에서 직접 컬 명령을 실행할 수 있기 때문에 이것은 이상합니다. 공백 등을 제거하지 않으면 구문 분석할 수 없는 여러 줄의 URL이 생성됩니다. Perl과 Bash에서 urlencoding을 사용해 보았지만 문제가 해결되지 않는 것 같습니다.

저는 지금 이것을 Mac에서 실행하고 있습니다. 사용법: sudo sh script.sh 무작위 문자열 무작위 문자열

편집: 새 스크립트의 출력

sudo sh script2.sh IT Denniz
curl: (3) Illegal characters found in URL
xx.xx.xx.xx/documentation/index.php?avdelning=XX&user=Denniz&hostname=admins-Mac-mini-2.local&model=ModelName:Macmini
ModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2Duo
ProcessorSpeed:2.4GHz
NumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=  etherXX:XX:XX:XX:XX&SERIALNUMBER=SerialNumber(system):XXXXXXXXXXX&LASTLOGGEDIN=adminadmins008Jun10:21

답변1

문자열에 리터럴 따옴표를 삽입하고 싶지 않습니다. 변수 주위에 따옴표가 필요합니다. 나는 이렇게 할 것이다:

#!/bin/bash

hw_data=$(/usr/sbin/system_profiler SPHardwareDataType)

ram=$(grep Memory: <<<"$hw_data")
model=$(grep Model <<<"$hw_data")
cpuname=$(grep Processor <<<"$hw_data")
cpucores=$(grep Cores: <<<"$hw_data")
serial=$(grep Serial <<<"$hw_data")

macaddr=$(ifconfig | grep en0 -A3 | grep ether)
loggedin=$(finger | tail -1)
hostname=$(hostname)

avdelning=$1
user=$2

url="ip.ip.ip.ip/documentation/index.php"
url+="?avdelning=${avdelning}"
url+="&user=${user}"
url+="&hostname=${hostname}"
url+="&model=${model}"
url+="&RAM=${ram}"
url+="&CPU=${cpuname}"
url+="&CPUCORES=${cpucores}"
url+="&MACADDRESS=${macaddr}"
url+="&SERIALNUMBER=${serial}"
url+="&LASTLOGGEDIN=${loggedin}"

curl "${url// /}"
#    ^          ^   <- these are the critical quotes

인용의 중요성에 대해 자세히 알아보려면 다음 기사를 읽어보세요.bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험

관련 정보