Posts shell交互和php
Post
Cancel

shell交互和php

接昨天的情况,因为是陈年老脚本,所以在新分的服务器上搭不出来。问学长也没弄出个所以然,可能是之后的更新导致的细节问题,但是目前任务要紧,先在已经放了python项目且能跑通的老服务器上搭后端环境并做一个配套。

php下载并安装

下载链接

1
2
3
chmod +x xampp-...
./xampp-...
/opt/lampp/lampp start

进行一些基本的配置

增加端口和目录的对应,不使用默认目录,不然一更新什么都没了。

修改/opt/lampp/etc下的配置文件即可,注意不显示目录,和限制文件下载。处于安全,不然网站容易被打成筛子

1
2
3
4
5
6
<FilesMatch "\.(sh|json)">
    Order Deny,Allow
    Deny from all
</FilesMatch>
# 这是加载Docunmentroot这项里的

编写shell脚本调用

因为这个python脚本需要先激活环境才能跑,想到通过写一个shell来调用它,结果写入文件,php调shell读文件即可。

发现shell不能空行,会报not found 行号 得错误。进一步多次研究,发现需要在shell脚本里登录用户,因此得安装except和tcl

参考文章链接

命令记录一下

1
2
3
4
5
6
sudo ./configure
sudo make
sudo make install
sudo ./configure --with-tclinclude=/home/pengpai/pengyuan/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/
sudo make
sudo make install

继续改进方案

最大的问题现在是,linux服务器划分了很细的权限,一个shell脚本必须先登录适当的用户。最终写出了下面这个版本的shell,注意一定别忘了写\r

1
2
3
4
5
6
7
8
9
10
spawn su - 需要的用户名
expect "*密码*"
send "密码\r"
expect "*$*"
## 等待提示符出现
send "cd 需要的版本的环境目录\r"
expect "*$*"
send "./python 目标python和参数\r"
expect "*$*"
exit

继续改进方案1.0

上面的可行,但是从完成的代码的视角实在是不好看,主要是很多目录贼长,实际的代码可读性变得很差,并且是直接用环境对应的python进行运行的。此外还要让脚本从外界接收参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set text [lindex $argv 0]  
## 获取参数
spawn su - 用户名
expect "*密码*"
send "密码\r"
## 登录有对应权限的用户
expect "*$*"
send "source ~/conda.sh\r"
expect "*$*"
send "conda activate py35\r"
## 激活环境
expect "*$*"
send "cd  脚本所在目录\r"
expect "*$*"
send "python extract_demo.py $text\r"
expect "*$*"
## 执行
exit

写php

写个php调shell,然后用php处理结果返回。任务完成。注意system会返回执行过程,因此用system调试很方便,最后再用exec。

其他参考资料

linux expect spawn 的用法

使用expect脚本登录到root账号并执行命令

php的system使用

访问控制FileMatch

apache直接打开文件而不下载的问题

This post is licensed under CC BY 4.0 by the author.

python脚本布置到服务器

python的几个问题