免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5627 | 回复: 8
打印 上一主题 下一主题

如何实现在C程序中执行shell复杂脚本,C/S模式调用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-10 16:57 |只看该作者 |倒序浏览
10可用积分
服务端shell脚本为tools.sh,如下:
while true
do
# clear
echo "\n\n               系统管理工具"
echo "            ┏━━━━━━━━━━━━━━━━┓"
echo "            ┃   1.__数据库管理               ┃"
echo "            ┃   2.__磁盘空间管理             ┃"
echo "            ┃   3.__系统进程管理             ┃"
echo "            ┃   4.__其他辅助管理             ┃"
echo "            ┃   0.__退出                     ┃"
echo "            ┗━━━━━━━━━━━━━━━━┛"
echo "             请输入选项: \c"
read xx
case $xx in
      1)
      database_manag.sh      ;;
      2)
      DiskSpace_manag.sh      ;;
      ;;
      3)
      sysProc_manag.sh      ;;
      ;;
      4)
      orther_manag.sh      ;;
      ;;
      0)
      exit
      #break
      ;;
esac
done

不允许才用telnet或ssh方式登录主机执行该脚本,要求才用socket调用方式执行,也就是server端有一守护进程,该进程将tools.sh执行的结果输出到client端,在client端完成交互操作。
研究了半天,发现用popen函数打开tools.sh脚本后,在输出到新建的文件中能看到tools.sh的执行结果,但没有找到交互操作的办法。
试验程序如下(未完善):
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int   WriteFile(const   char   *filename,const   char   *pFile,const   int   nLen)
{
   FILE   *stream=NULL;
   stream=fopen(filename,"w+");
   if (stream==NULL)
      {
       perror("Open   file   error");
       return   -1;
      }

   if (fwrite((void *)pFile,1,nLen,stream)!=nLen)
      {
       perror("Write   file   error");
       fclose(stream);
       return   -1;
       }
     fclose(stream);
     return   0;
}


int main()
{
   FILE   *stream;
   char   buf[4096];

   int    fd3,s_fd,n_fd;

   stream=popen("tools.sh","r");
   fread(buf,sizeof(char),4096,stream);
   WriteFile("test.txt",buf,4096);

   fd3=open("test.txt","w");
   if (fd3 < 0)
      {
        printf("open error\n");
        exit(-1);
       }

    /* 复制标准输出描述符 */
    s_fd = dup(STDOUT_FILENO);
    if (s_fd < 0)
       {
        printf("err in dup\n");
        }

    /* 重定向恢复标准输出 */
     if (dup2(s_fd, n_fd) < 0)
        {
         printf("err in dup2\n");
        }

   write(STDOUT_FILENO,buf,1024);
   pclose(stream);
   return 0;
}


请不吝赐教,谢谢。

[ 本帖最后由 小雨飞 于 2009-3-10 17:51 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-03-10 19:15 |只看该作者
脚本要交互的情况下就要用双向管道了,或者建两个单向管道,一个读,一个写。
aquei 该用户已被删除
3 [报告]
发表于 2009-03-10 22:48 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-03-10 23:01 |只看该作者
这个帖子好,跟踪一下

论坛徽章:
0
5 [报告]
发表于 2009-03-12 14:24 |只看该作者
原帖由 小雨飞 于 2009-3-10 16:57 发表
不允许才用telnet或ssh方式登录主机执行该脚本,要求才用socket调用方式执行,也就是server端有一守护进程,该进程将tools.sh执行的结果输出到client端,在client端完成交互操作。
研究了半天,发现用popen函数打开tools.sh脚本后,在输出到新建的文件中能看到tools.sh的执行结果,但没有找到交互操作的办法。

==============================================
不知道你们怎么考虑的,不许ssh,难道你的Socket就不开端口了吗?或者用UDP,IP包通讯就更容易了吗?
搞这个东西还是用现成的系统工具比较牢靠,自己做的东西感觉很牛逼,其实运行起来之后,就会发现问题多多:wink: :wink:
这是我的个人看法,可以考虑下。

[ 本帖最后由 duanjigang 于 2009-3-12 14:27 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-12 14:29 |只看该作者
如果想利用SSH封装下实现你这个功能,可以参考下我做的这个工具,或许拿来直接就能用。
http://bbs.chinaunix.net/viewthread.php?tid=1263669

论坛徽章:
0
7 [报告]
发表于 2009-03-12 14:32 |只看该作者
如果不让用ssh之类的东西,可以做个服务端程序,客户端发送命令后,服务器执行命令,把结果重定向到一个文件中,然后把结果文件发给客户端就行。
至于这个结果文件的返回,可以用FTP现成的,如果还不让用FTP的话,可以用另外一个socket实现的简单工具传送。
http://bbs.chinaunix.net/viewthread.php?tid=1274290
这是我做的一个简单的TCP传文件的例子,你可以直接execlp调用客户端和服务器端。

论坛徽章:
0
8 [报告]
发表于 2009-03-12 14:41 |只看该作者

回复 #7 duanjigang 的帖子

LS的是实力派啊。。。

论坛徽章:
0
9 [报告]
发表于 2009-03-13 18:03 |只看该作者
popen只能是单向的,因为只返回一个stream。要么从执行进程的标准输出读数据,要么往执行进程的标准输入写数据。
如果要交互,可以参考一下http服务器实现CGI的方式:
1、fork一个子进程;
2、将socket fd重定向为新进程的stdin和stdout;
3、使用exec系列函数在新进程中执行新的可执行文件;
这样一来,在执行的可执行文件(比如LZ给出的脚本)中,就可以从socket直接读写了。如果不希望直接读写,或者直接读写有问题,那么就只有在fork以前先创建两个pipe,子进程通过pipe与父进程交互、父进程再用socket与client交互。

[ 本帖最后由 kouu 于 2009-3-13 18:05 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP