Unix / Macシステム用のドキュメントを生成する「簡単な」スクリプトを作成しようとしています。必要な情報が正常に受信されましたが、情報出力に一部のスペースと文字が表示されるため、CURLを使用して作成されたWebサーバーに送信できないようです。私はたくさん試してみましたが、そのうち何も動作しないようです。
以下は、スクリプトがカールに送信する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を使用してこれを直接実行すると、次の文字列を使用すると機能し、エラーは発生せず、Webサーバーから情報を受け取ります。
しかし、スクリプトを使用すると動作しません。スクリプト:
#!/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シェルで変数を引用することを忘れてしまうセキュリティリスク