shell脚本中的sudo命令,由PHP

时间:2015-09-04 06:58:14

标签: php bash shell sed centos

背景

我已经制作了一个 PHP Web应用程序来执行 Linux Shell脚本来更改CentOS 7的网络脚本中的数据。换句话说,这是一个可以在CentOS 7中更改IP的PHP Web应用程序。

脚本本身很适合更改,我可以使用具有适当参数的SSH来运行脚本,其用法如下:

sh ./ipchanger.sh <fileName> <oldIpAddress> <newIpAddress> <oldSubnetMask> <newSubnetMask> <oldGateway> <newGateway>

样本用法:

 sh ./ipchanger.sh /etc/sysconfig/network-scripts/ifcfg-ens32 192.168.1.5 192.168.1.205 PREFIX0=32 PREFIX0=24 192.168.1.1 192.168.1.1

这会将IP从192.168.1.5更改为192.168.1.205,子网掩码将从255.255.255.255更改为255.255.255.0。网关将保持不变。

<小时/>

PHP应用程序

数据将从使用PHP处理的表单发布。代码将检查IP地址是否正确。如果收集并正确的参数,我的PHP代码将调用shell脚本来更改网络脚本。

像这样:

$retval = exec('sh /var/www/html/ipchanger/ipchanger.sh {$fileName} {$currentIpAddress} {$newIpAddress} {$currentSubnetMask} {$newSubnetMask} {$currentGateway} {$newGateway}');

这意味着:

$retval = exec('sh /var/www/html/ipchanger/ipchanger.sh /etc/sysconfig/network-scripts/ifcfg-ens32 192.168.1.5 192.168.1.205 PREFIX0=32 PREFIX0=24 192.168.1.1 192.168.1.1');

<小时/>

Shell Scripts

#!/bin/sh
#
# My IP Changer

fileName="$1"
currentIpAddress="$2"
newIpAddress="$3"
currentSubnetMask="$4"
newSubnetMask="$5"
currentGateway="$6"
newGateway="$7"

`sudo sed -i -e "s/$currentIpAddress/$newIpAddress/g" ${fileName}`
`sudo sed -i -e "s/$currentSubnetMask}/$newSubnetMask/g" ${fileName}`
`sudo sed -i -e "s/$currentGateway/$newGateway/g" ${fileName}`

<小时/>

问题

文件/etc/sysconfig/network-scripts/ifcfg-ens32完全没有变化。如果我在SSH中运行shell脚本(请参阅后台章节中的示例用法),它可以工作!所以我的shell脚本应该没问题。

<小时/>

其他试验

1。将echo放在shell脚本中以查看参数是否位于正确的位置
结果:是的。
争论显示就像预期一样。

2。将2&gt;&amp; 1放在exec()后面 结果:消息显示。
sudo: sorry, you must have a tty to run sudo。我不知道sed是否需要root权限。所以我把它放在shell脚本中,以使shell脚本执行得更顺畅。

第3。在shell脚本中删除sudo
结果:在SSH中,很好;在PHP中,消息显示。
sed: couldn't open temporary file /etc/sysconfig/network-scripts/sedJfDtCD: Permission denied。我用谷歌搜索了这条消息。使用sed -i时,它会创建一个临时文件来存储原始文件,以防脚本搞砸。

4。在shell脚本中删除-i in sed命令
结果:失败。
该脚本无法执行其任务。

<小时/>

其他信息

  • 操作系统:CentOS
  • 网络服务器类型: LAMP
  • whoami: apache
  • 脚本用法:内部使用。所以我不关心安全问题
  • 请帮忙!感谢。

    2 个答案:

    答案 0 :(得分:0)

    不是直接针对你的问题,但我建议在此类文件更改中添加一些安全性

    并使用以下方法优化最后三行:

    `sudo sed -i -e "s/$currentIpAddress/$newIpAddress/g;s/$currentSubnetMask}/$newSubnetMask/g;s/$currentGateway/$newGateway/g" ${fileName}`
    
    • 每个g的最后s///通常不是必需的(只有1个按行更改)

    答案 1 :(得分:0)

    我最近发布了一个项目,允许PHP获取真正的Bash shell并与之交互(如果需要,可以是用户:apache / www-data或root)。在此处获取:https://github.com/merlinthemagic/MTS

    下载后,您只需使用以下代码。

    //You could maintain your ipchanger.sh script and simply trigger that script
    //through the shell, but the point of the shell project is that it lets you 
    //trigger commands directly. in your case you could do this:
    
    $ifFilePath = '/etc/sysconfig/network-scripts/ifcfg-ens32';    
    
    $ifCfg= "DEVICE=ens32";
    $ifCfg.= "\nIPADDR=192.168.1.205";
    $ifCfg.= "\nPREFIX0=24";
    $ifCfg.= "\n192.168.1.1";
    
    $strCmd = "echo \'".$ifCfg."\' > \'".$ifFilePath."\'";
    
    //But if you wanna stick with your script then:
    
    $strCmd = "sh ./ipchanger.sh /etc/sysconfig/network-scripts/ifcfg-ens32 192.168.1.5 192.168.1.205 PREFIX0=32 PREFIX0=24 192.168.1.1 192.168.1.1";
    
    //in either case the $strCmd is triggered like this:
    $shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
    $return1  = $shell->exeCmd($strCmd);
    

    配置文件更改后,您可以使用相同的shell重新加载接口配置:

    $return2  = $shell->exeCmd('service network restart');