代码:
#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;
}
从命令行以www-data
用户身份运行时的输出:
<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>
通过网络浏览器访问时的输出:
<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>
答案 0 :(得分:2)
您的fscanf
电话中显示非ASCII格式(对于学位标志)。
在CGI中执行时,由于LANG=C
,解析可能会停止,而在命令行执行时则设置为其他内容。
答案 1 :(得分:1)
好的,所以我发现了问题...显然,只要apache运行web请求的程序,就不包括度数字符,而是包含空格字符。我还可以通过将输出传递给另一个应用程序来从命令行复制该问题,如下所示:
./hddtemp.cgi | tee
删除度数字符可修复Web请求的输出,但在命令行调用时会出现问题。看起来我被困在一个或另一个工作。