cgi获取所有环境变量[C语言]
2011-10-13 16:16
459 查看
摘自:http://blog.chinaunix.net/space.php?uid=620765&do=blog&cuid=297086
还记得C语言main函数的完整声明吗?
int main(int argc, char **argv, char **envp);
这个就是c语言中main函数的完整声明, argc表示参数个数,argv表示参数字符串,而这个envp就表示环境变量字符串。参数和环境变量都可以不止一个,所以,用指向字符串指针的指针来表示。
比如我们用C语言写了一个程序,运行在命令行下,带有2个参数
C:> cpfile.exe c:\test.txt d:\test.txt
那么这里的
argc=3;
argv[0] = "cpfile.exe";
argv[1] = "c:\test.txt";
argv[2] = "d:\test.txt";
在c语言中的stdlib.h中有一个
extern char **environ; 或者
extern char **_environ;的声明
这个envp的参数实际上就是environ。
好,我们看看在cgi程序(其实就是一个C语言程序)里面怎么枚举这些环境变量
先写一个html页面:(当然也可以不要)
<form name="form1" method="POST" action="cgi-bin/env.cgi">
Username: <input type = "text" name="usr"> <br>
Password: <input type = "password" name="pwd"><br>
<input type="submit" name="submit" value="Submit">
<input type="reset" name = "reset" value="Reset">
</form>
呈现效果如下:
Username:
Password:
cgi程序源码:
/* env.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CONTENT_LEN 1024
int main()
{
extern char **environ;
int nlen = 0;
int i;
char szContent[MAX_CONTENT_LEN];
char **penv;
char *req = NULL;
memset(szContent, 0, MAX_CONTENT_LEN);
printf("Content-type: text/html\n\n");
for ( penv = environ; *penv; penv++ )
printf("%s<br>", *penv);
if ( strcmp("POST", getenv("REQUEST_METHOD")) == 0 )
{
nlen = atoi(getenv("CONTENT_LENGTH"));
for (i = 0; i < nlen; i++ )
{
if ( i < MAX_CONTENT_LEN )
szContent[i] = fgetc(stdin);
else
break;
}
printf("<p>%s</p>", szContent);
}
else
{
printf("<p>%s</p>", getenv("QUERY_STRING"));
}
return 0;
}
在地址栏 http://localhost/testenv.htm
假设我们输入的用户名和密码分别为abcd和efgh,提交表单之后,在我的机器上显示的结果如下:
COMSPEC=C:\WINDOWS\system32\cmd.exe
CONTENT_LENGTH=31
CONTENT_TYPE=application/x-www-form-urlencoded
DOCUMENT_ROOT=d:/chateaurt4/www
HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_CHARSET=gb2312,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE=zh-cn,zh;q=0.5
HTTP_CONNECTION=keep-alive
HTTP_HOST=localhost
HTTP_KEEP_ALIVE=300
HTTP_REFERER=http://localhost/testenv.htm
HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Microsoft Visual Studio\Common\Tools\WinNT;D:\Microsoft Visual Studio\Common\MSDev98\Bin;D:\Microsoft Visual Studio\Common\Tools;D:\Microsoft Visual Studio\VC98\bin;D:\AppServ\Apache2.2\bin;D:\AppServ\php5;D:\AppServ\MySQL\bin
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=1644
SCRIPT_FILENAME=d:/chateaurt4/www/cgi-bin/env.cgi
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=who@where.net
SERVER_NAME=localhost
SERVER_PORT=80
SERVER_SIGNATURE=
Apache/1.3.33 Server at localhost Port 80
SERVER_SOFTWARE=Apache/1.3.33 (Win32)
SystemRoot=C:\WINDOWS
WINDIR=C:\WINDOWS
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=POST
QUERY_STRING=
REQUEST_URI=/cgi-bin/env.cgi
SCRIPT_NAME=/cgi-bin/env.cgi
usr=abcd&pwd=efgh&submit=Submit
当然不同的机器,它输出的有些结果可能不一样。如果单纯为了输出环境变量,我们可以这样做:
#include <stdio.h>
int main (int argc, char **argv, char **envp)
{
char **var = envp;
while (*var)
printf ("%s \n",*var++);
return 0;
}
这里面得到的环境变量结果和CGI程序里面的结果差别比较大,因为一个是获得与web应用程序有关的环境变量,而一个获得的是系统的环境变量。
还记得C语言main函数的完整声明吗?
int main(int argc, char **argv, char **envp);
这个就是c语言中main函数的完整声明, argc表示参数个数,argv表示参数字符串,而这个envp就表示环境变量字符串。参数和环境变量都可以不止一个,所以,用指向字符串指针的指针来表示。
比如我们用C语言写了一个程序,运行在命令行下,带有2个参数
C:> cpfile.exe c:\test.txt d:\test.txt
那么这里的
argc=3;
argv[0] = "cpfile.exe";
argv[1] = "c:\test.txt";
argv[2] = "d:\test.txt";
在c语言中的stdlib.h中有一个
extern char **environ; 或者
extern char **_environ;的声明
这个envp的参数实际上就是environ。
好,我们看看在cgi程序(其实就是一个C语言程序)里面怎么枚举这些环境变量
先写一个html页面:(当然也可以不要)
<form name="form1" method="POST" action="cgi-bin/env.cgi">
Username: <input type = "text" name="usr"> <br>
Password: <input type = "password" name="pwd"><br>
<input type="submit" name="submit" value="Submit">
<input type="reset" name = "reset" value="Reset">
</form>
呈现效果如下:
Username:
Password:
cgi程序源码:
/* env.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CONTENT_LEN 1024
int main()
{
extern char **environ;
int nlen = 0;
int i;
char szContent[MAX_CONTENT_LEN];
char **penv;
char *req = NULL;
memset(szContent, 0, MAX_CONTENT_LEN);
printf("Content-type: text/html\n\n");
for ( penv = environ; *penv; penv++ )
printf("%s<br>", *penv);
if ( strcmp("POST", getenv("REQUEST_METHOD")) == 0 )
{
nlen = atoi(getenv("CONTENT_LENGTH"));
for (i = 0; i < nlen; i++ )
{
if ( i < MAX_CONTENT_LEN )
szContent[i] = fgetc(stdin);
else
break;
}
printf("<p>%s</p>", szContent);
}
else
{
printf("<p>%s</p>", getenv("QUERY_STRING"));
}
return 0;
}
在地址栏 http://localhost/testenv.htm
假设我们输入的用户名和密码分别为abcd和efgh,提交表单之后,在我的机器上显示的结果如下:
COMSPEC=C:\WINDOWS\system32\cmd.exe
CONTENT_LENGTH=31
CONTENT_TYPE=application/x-www-form-urlencoded
DOCUMENT_ROOT=d:/chateaurt4/www
HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_CHARSET=gb2312,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE=zh-cn,zh;q=0.5
HTTP_CONNECTION=keep-alive
HTTP_HOST=localhost
HTTP_KEEP_ALIVE=300
HTTP_REFERER=http://localhost/testenv.htm
HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Microsoft Visual Studio\Common\Tools\WinNT;D:\Microsoft Visual Studio\Common\MSDev98\Bin;D:\Microsoft Visual Studio\Common\Tools;D:\Microsoft Visual Studio\VC98\bin;D:\AppServ\Apache2.2\bin;D:\AppServ\php5;D:\AppServ\MySQL\bin
REMOTE_ADDR=127.0.0.1
REMOTE_PORT=1644
SCRIPT_FILENAME=d:/chateaurt4/www/cgi-bin/env.cgi
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=who@where.net
SERVER_NAME=localhost
SERVER_PORT=80
SERVER_SIGNATURE=
Apache/1.3.33 Server at localhost Port 80
SERVER_SOFTWARE=Apache/1.3.33 (Win32)
SystemRoot=C:\WINDOWS
WINDIR=C:\WINDOWS
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=POST
QUERY_STRING=
REQUEST_URI=/cgi-bin/env.cgi
SCRIPT_NAME=/cgi-bin/env.cgi
usr=abcd&pwd=efgh&submit=Submit
当然不同的机器,它输出的有些结果可能不一样。如果单纯为了输出环境变量,我们可以这样做:
#include <stdio.h>
int main (int argc, char **argv, char **envp)
{
char **var = envp;
while (*var)
printf ("%s \n",*var++);
return 0;
}
这里面得到的环境变量结果和CGI程序里面的结果差别比较大,因为一个是获得与web应用程序有关的环境变量,而一个获得的是系统的环境变量。
相关文章推荐
- cgi和fastcgi获取所有环境变量(C语言)
- C语言获取系统环境变量
- Get Environment Strings by injection[使用dll注入来获取所有的环境变量包括临时环境变量]
- Java代码获取所有系统环境变量
- 获取CGI环境变量
- cgi程序常用环境变量及获取方法
- 获取所有环境变量
- C语言获取系统环境变量
- 获取各种CGI环境变量
- 如何用C语言获取网卡的mac地址?(当然,你也可以用类似方法获取所有ip)
- java获取所有系统变量
- java中获取环境变量
- 查看所有的Server Variables的环境变量
- asp循环获取URL地址中的所有变量参数值
- gradle获取环境变量
- Hadoop map reduce 过程获取环境变量
- 获取环境变量
- java 获取系统变量(环境变量和设置变量)
- mac上ide中无法获取环境变量的问题
- 获取系统环境变量: ACE_OS::getenv