我正在尝试创建一个“简单”脚本,用于为 Unix/Mac 机器创建一些文档。我已成功收到所需的信息,但似乎无法将其发送到使用 CURL 创建的网络服务器,因为它在信息输出中提供了一些空格和字符。我尝试了很多方法,但似乎没有一个能正常工作。
这是脚本将发送给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
这很奇怪,因为我可以直接在终端中运行curl命令而不会出现该错误。如果我不删除空格等,我会收到多行 URL 无法解析的信息。我已经尝试在 perl 和 bash 中使用 urlencoding 但这似乎也不能解决问题。
我现在在 Mac 上运行这个。用法: sudo sh script.sh randomstring randomstring
编辑:新脚本的输出
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 shell 中引用变量的安全隐患