我已经制作了一个 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处理的表单发布。代码将检查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');
<小时/>
#!/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命令
结果:失败。
该脚本无法执行其任务。
<小时/>
请帮忙!感谢。
答案 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');