2008年5月10日星期六

Linux下使用JNI控制squid代理服务器

利用JNI实现Linux下squid代理服务器的控制
1、Java文件

public class MyJni{
        public native void exec();
        static{
System.loadLibrary("MyJni");
        }
}
public class Test{
        public static void main(String[]  args){
                new MyJni().exec();
        }

2、编译,并用javah产生头文件

javac MyJni.java
javac Test.java
javah -jni MyJni 

3、编写C程序,注意包含上面产生的头文件

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include "MyJni.h"
JNIEXPORT void JNICALL Java_MyJni_exec(JNIEnv *env,jobject obj){
uid_t uid ,euid;
//      char cmd[1024];
uid = getuid() ;
euid = geteuid();
printf("my uid :%u\n",getuid());  //这里显示的是当前的uid 可以注释掉.
printf("my euid :%u\n",geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid))  //交换这两个id
perror("setreuid");
printf("after setreuid uid :%u\n",getuid());
printf("afer sertreuid euid :%u\n",geteuid());
system("service squid restart"); //重新启动squid服务
}
int main(){
Java_MyJni_exec(NULL,NULL);
        return 0;

4、编译

gcc -o libMyJni.so -shared MyJni.c -static -lc 

5、添加动态链接库所在的路径到LD_LIBRARY_PATH环境变量

export LD_LIBRARY_PATH=/root; 

6、运行Java程序

java Test 

通过之后,也可以在Web应用程序中调用此功能

没有评论:

发表评论