分享
 
 
 

用重定向原理实现远程执行交互

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

用重定向原理实现远程执行交互这是一个简单工具,用于远程执行在服务器上的脚本或进程。

原理是在服务器上将socket重定向到所运行的进程的标准输入输出流,这样进程的标准输出(STDOUT)会自动发送到客户端,客户端写到socket上的数据自动输出到进程的标准输入(STDIN),这样就实现了远程交互,类似telnet服务.

代码如下:

blockquote { background-color: #BBBBEE; font-family:arial,宋体; face="fixedsystem";font-size:9pt; padding: 5px; margin-right: 35px; right: 0px; clip: rect(auto,0px,auto,auto); }

//句柄复制 from qmail tcpserver

int fd_copy(int to,int from)

{

if (to == from) return 0;

if (fcntl(from,F_GETFL,0) == -1) return -1;

close(to);

if (fcntl(from,F_DUPFD,to) == -1) return -1;

return 0;

}

//句柄复制,并关闭源句柄 from from qmail tcpserver

int fd_move(int to,int from)

{

if (to == from) return 0;

if (fd_copy(to,from) == -1) return -1;

close(from);

return 0;

}

//处理客户端连接的主循环

void clientloop(CONNECT_INFO *pConn)

{

int pid ;

int stat = 0;

int res = 0;

char cmd[100]="";

char Prompt[]="->"; //定义提示符

int i;

SendData(pConn->socket,Prompt,strlen(Prompt)); //输出提示符

while(1) //主循环

{

memset(cmd,0,sizeof(cmd));

if(RecvData(pConn->socket,cmd,sizeof(cmd),1000 )>0) //从socket上获取指令(主进程)

{

chomp(cmd); //去掉回车换行,TAB,空格

printf("Get cmd:[%s]\n",cmd); //在服务器端打印出收到的命令

if(strcmp(cmd,"quit")==0) //收到quit则退出

{ break; }

pid = fork(); //创建子进程

if(pid < 0) //错误

{

perror("fork error");

break;

}

if(pid > 0) //主进程

{

waitpid(pid,&stat,WCONTINUED); //等待子进程退出

kill(pid,9); //再kill一次防止僵死进程

SendData(pConn->socket,Prompt,strlen(Prompt)); //发送提示符号

}else{

fd_copy(0,pConn->socket); //将socket重定向到标准输入

fd_move(1,pConn->socket); //将标准输出重定向到socket

printf("[%d]run cmd %s\n",getpid(),cmd); //打印当前命令

res = execl(cmd,"",(char*)0); //使用execl运行指令,子进程被指令创建的进程取代,该进程的输入输出已经被重定向

if (errno == ENOEXEC) //这是处理某些没有指定默认shell的脚本

execl ("/bin/sh", "sh", "-c", cmd, (char *)0);

else

printf("run res = %d,%s\n",res,strerror(errno)); //错误输出到客户端

exit(0);

}//pid

}//recvdata

}//while

}

//主程序入口

main(){

/*建立监听socket,获得客户端连接,对新连接fork进程,调用clientloop*/

}

目前这个代码还比较粗糙,能实现基本的运行和交互,最需要优化的主要是execl的调用方法,这样的写法只能输入完整路径名,而且不能带参数。可以

1:根据当前的PATH环境变量,实现类似whereis功能,

2:对输入的命令行进行解析,获取命令参数,构造成char **字符数组传递给execl.

还有一种方式是用popen,用popen的效果也满不错,比起用execl来,避免了以上1,2问题,还可以对输出的信息先进行处理再发给客户端

int runcmdpipe(const char *sCmd)

{

char pline [1024];

FILE *fp = NULL;

if ((fp = popen (sCmd, "r")) == NULL)

return -1;

while (fgets (pline, sizeof(pline)-1, fp)!= NULL)

{

printf(">> %s",pline); //输出到客户端

}

pclose (fp);

return ncount;

}

客户端可以用telnet程序,但unix和windows的telnet客户端有小小差异,unix的telnet输入回车才发送,而windows的telnet一击键即刻发送,所以程序应该判断是否得到回车换行,才认为是一个完整的指令。

还有一些unix命令如su,top,vi在这种模式下运行不太顺畅,但此工具已经满足要求了,以后有空再研究如何解决。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有