命令不在shell上工作但在提示时工作


1

我是Linux Shell脚本的新手。我想通过Linux Shell脚本更改IP地址,并由PHP Web应用程序调用。

我已经完成了我的PHP Web应用程序和shell脚本。在它们组合在一起工作之前,我想测试Shell脚本是否可以正常运行。

我的Linux Shell脚本将存储7个变量,不包括$ 0(脚本名称):

  1. 网络接口文件(/etc/sysconfig/network-scripts/ifcfg-{XXX}
  2. 旧IP地址
  3. 新的IP地址
  4. 旧子网掩码
  5. 新的子网掩码
  6. 老门户
  7. 新网关

我的PHP应用程序已经执行了大多数检查,因为我是Linux Shell脚本的新手,我不想在我的shell脚本上执行此操作。我的PHP应用程序可以确保数据正确并填充值。

因此,要运行此Shell脚本,请键入以下内容以查看结果:

sh ./ipchanger.sh /etc/sysconfig/network-scripts/ens32 192.168.1.18 192.168.1.201 32 24 192.168.1.1 192.168.1.1 

含义:

  1. 指定目标网络脚本文件。
  2. 将IP更改192.168.1.18192.168.1.201
  3. 将子网掩码更改255.255.255.255255.255.255.0

实际上它将运行以下命令:

sudo sed -i -r "s/$currentIpAddress/$newIpAddress/g" $fileName
sudo sed -i -r "s/$currentSubnetMask/$newSubnetMask/g" $fileName
sudo sed -i -r "s/$currentGateway/$newGateway/g" $fileName

它不返回任何错误,并且看起来很好,因为网络脚本文件的最后修改日期已更新。但是当我打开文件时,没有任何改变。

然后我echo是命令,它返回我想要的确切命令。然后我通过命令提示符运行所有三行并再次检查文件,所有信息都已更改!


如果您的问题不是@davidgo建议的sudo,您可能需要确认两个接口都使用相同的shell。您可能想尝试运行echo $SHELLps -p $$在两个界面中确认它们是相同的。
弗兰克托马斯

Answers:


0

问题很可能sudo是每一行开头的一点。 sudo意味着“以root身份运行。”您可能会发现,有效地,您在命令行中登录的帐户已经设置/etc/sudoers为从命令行工作,而不是通过PHP脚本 - 实际上您需要当你通过网络用户运行它时,请考虑这一点的含义 - 网络用户可能不会设置/etc/sudoers- 而且不应该!

您可以通过更改文件的所有权并在不运行脚本的情况下测试此理论sudo。要简单地更改文件所有权chown filename.ext

我认为你会更好:

  1. 创建一个新目录/var/www(或者在您感觉舒适并且Web用户可以访问的任何地方)
  2. 将适当的配置文件移动到该目录
  3. 将单个文件或包含它的目录合成到www。
  4. 将这些文件的所有权更改为WWW目录
  5. 在每个命令的开头删除sudo。更好的是,为什么不放弃调用脚本并简单地用PHP编写更改。

删除sudo每行开头后,它仍然有效!
AkiEru 2015年

“whoami”说什么,你正在使用的PHP“exec”类型命令是什么?
davidgo 2015年

whoami显示阿帕奇
AkiEru 2015年

这没什么意义。当您从bash提示符或通过脚本运行它时会发生这种情况吗?文件的权限是什么?
davidgo 2015年

现在我可以让shell脚本本身更改IP地址。但在PHP中,它不可能。
AkiEru 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.