免费注册 查看新帖 |

Chinaunix

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

如何用perl写的cgi去执行另外一个服务器上的shell脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-05 12:13 |只看该作者 |倒序浏览
我用perl编写一个cgi程序,想用这个cgi执行一个shell脚本,但这个shell脚本和这个cgi不在同一台服务器上
这个shell脚本就是一个普通的脚本(.sh文件),它只做一件事,就是执行make命令,编译当前目录下的c程序。这个cgi一执行,就调用.sh脚本来编译这个脚本所在服务器上的所在目录下的c程序。

请问该如何实现呢,代码怎么写?

论坛徽章:
0
2 [报告]
发表于 2006-06-05 12:49 |只看该作者
1)配置sshd用Key的方式,可以自动登陆无须密码;
2)用expect模块;
3)在数据库里设置一个标记,执行cgi脚本后,就打上这个标记,另一台跑个crontab定时检查这个标记,若发现已设置,则跑Make程序。

论坛徽章:
0
3 [报告]
发表于 2006-06-05 13:30 |只看该作者
或许仙子说的是一种解决办法。可是,cgi是一个用户页面,用户点击页面上的按钮,这个cgi就会调用执行那个shell脚本,若设置crontab定时检查,就无法达到实时的效果了。

论坛徽章:
0
4 [报告]
发表于 2006-06-05 16:54 |只看该作者
原帖由 takefree 于 2006-6-5 13:30 发表
或许仙子说的是一种解决办法。可是,cgi是一个用户页面,用户点击页面上的按钮,这个cgi就会调用执行那个shell脚本,若设置crontab定时检查,就无法达到实时的效果了。


我说了3种方法呀,你用前2种不就得了么?

论坛徽章:
0
5 [报告]
发表于 2006-06-05 18:02 |只看该作者
第一种方法不行,因为不能那样改
第二种方法好像也很复杂,还是不知道怎么做。
我是个perl新手,不知道怎么用那个模块,自己也找了一些资料,看的我一头雾水。

能不能再详细描述一下第一种做法?

[ 本帖最后由 takefree 于 2006-6-6 09:41 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-06-05 20:07 |只看该作者
其实你的问题不在perl自身,在于2台主机间的通信方式。
sshd是通用的方式,
ssh user@192.168.xx.xx "cd dir;make"
这行这条shell语句就可以在另外一台host上执行make了。

这里由于是直接ssh过去的,没有使用密码,所以你要配置下host使用key认证,并把公私钥匙都拷贝到cgi机器上(存在安全风险)。如果使用密码认证的话,可以使用Expect模块了,去search一下CPAN。

如果是偶做的话,会在对端的host写一个svr,在cgi接受到请求后,发送一个指令到对端host的svr端口,对端host收到这个指令后,执行后台的make命令即可。

论坛徽章:
0
7 [报告]
发表于 2006-06-06 09:22 |只看该作者
仙子绝对不是一般人,太厉害了!第一种办法已经明白了,可是我无法也不可能修改认证方式。其他的方式应该也可以解决,但对我来说有点复杂,不便上手解决。还有没有别的办法呢,比如通过http调用另一台服务器上的脚本。谢谢!

[ 本帖最后由 takefree 于 2006-6-6 09:40 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-06-06 11:21 |只看该作者
原帖由 takefree 于 2006-6-6 09:22 发表
仙子绝对不是一般人,太厉害了!第一种办法已经明白了,可是我无法也不可能修改认证方式。其他的方式应该也可以解决,但对我来说有点复杂,不便上手解决。还有没有别的办法呢,比如通过http调用另一台服务器上的脚 ...


对,你在另一台主机上起一个apache服务,这边的cgi机器收到请求后,发一个get请求到另一台主机的80端口,然后那台主机收到这个get后,执行后台的make命令即可。

论坛徽章:
0
9 [报告]
发表于 2006-06-06 16:20 |只看该作者
请问仙子:我用perl这样写cgi,为什么cgi不会执行make呢?见下面的代码
目录~/src/mydir/tmp下有Makefile文件和需要编译的c程序。


my $cmdMake = "cd ~/src/mydir/tmp;make";
my $rtn = system("$cmdMake");

if($rtn != 0)
{
       //输出错误
}

我在服务器上直接用(在shell提示符下):cd ~/src/mydir/tmp;make,是可以编译~/src/mydir/tmp下的c程序的。为什么放到cgi中用system()执行就不起作用了呢?

[ 本帖最后由 takefree 于 2006-6-6 16:48 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-06-06 16:45 |只看该作者
原帖由 takefree 于 2006-6-6 16:20 发表
请问仙子:我用perl这样写cgi,为什么cgi不会执行make呢?见下面的代码
目录~/src/mydir/tmp下有Makefile文件和需要编译的c程序。


my $cmdMake = "cd ~/src/mydir/tmp;make";
my $rtn = system( ...



cd ~/src/mydir/tmp;make

这里要用绝对路径,因为cgi运行的用户通常是nobody,不是你现在的用户ID。
另外cgi运行的用户通常没什么权限,你也许要调整apache运行用户的权限设置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP