<table id="hddtemp">
<tr>
<th>Device</th>
<th>Mfg</th>
<th>Model</th>
<th>Temp</th>
</tr>
<tr>
<td>sda</td>
<td>WDC</td>
<td>WD2500AAKX-001CA0</td>
<td>29°C</td>
</tr>
<tr>
<td>sdb</td>
<td>WDC</td>
<td>WD20EURS-63S48Y0</td>
<td>30°C</td>
</tr>
<tr>
<td>sdc</td>
<td>WDC</td>
<td>WD20EURS-63S48Y0</td>
<td>30°C</td>
</tr>
<tr>
<td>sdd</td>
<td>WDC</td>
<td>WD20EURS-63S48Y0</td>
<td>30°C</td>
</tr>
</table>
:從命令行www-data
用戶運行時
#include <unistd.h>
#include <stdio.h>
typedef struct hddinfo
{
char szDevice[4];
char szMfg[64];
char szModel[64];
int nTemp;
} hddinfo;
int main(int argc, char *argv[])
{
setuid(0);
hddinfo hdi[4] = {0};
FILE *fp = popen("/usr/sbin/hddtemp /dev/sd[abcd]","r");
if(NULL != fp)
{
for(int i = 0; i < 4; i++)
fscanf(fp,"/dev/%3[^:]: %64s %64[^:]: %d°C\n",&hdi[i].szDevice, &hdi[i].szMfg, &hdi[i].szModel, &hdi[i].nTemp);
pclose(fp);
printf("Content-type: text/html\n\n");
printf("<table id=\"hddtemp\">\n\t<tr>\n\t\t<th>Device</th>\n\t\t<th>Mfg</th>\n\t\t<th>Model</th>\n\t\t<th>Temp</th>\n\t</tr>\n");
for(int i = 0; i < 4; i++)
printf("\t<tr>\n\t\t<td>%s</td>\n\t\t<td>%s</td>\n\t\t<td>%s</td>\n\t\t<td>%d°C</td>\n\t</tr>\n", hdi[i].szDevice, hdi[i].szMfg, hdi[i].szModel, hdi[i].nTemp);
printf("</table>");
}
else
printf("Status: 400 Bad Request\nContent-type: text/html\n\n");
return 0;
}
輸出通過網絡瀏覽器訪問時輸出:
<table id="hddtemp">
<tr>
<th>Device</th>
<th>Mfg</th>
<th>Model</th>
<th>Temp</th>
</tr>
<tr>
<td>sda</td>
<td>WDC</td>
<td>WD2500AAKX-001CA0</td>
<td>29°C</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>0°C</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>0°C</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>0°C</td>
</tr>
</table>
啊!!!!現在我明白了爲什麼在從命令行運行時輸入程度符號,而不是當它被管道或從Web服務調用時。看起來'hddtemp'正在檢查'LANG'環境變量並確定是否放置度符號。因此,如果我已將命令調用更改爲'LANG = C/user/sbin/hddtemp/dev/sd [abcd]「',並且刪除了度符號,則它可以用於兩者! – 2011-12-28 05:26:29