命令在 shell 上不起作用但在提示符下起作用

命令在 shell 上不起作用但在提示符下起作用

我是 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. 新门户

由于我是 Linux Shell 脚本的新手,大多数检查已由我的 PHP 应用程序执行,我不想在我的 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命令,它返回我想要的确切命令。然后我通过命令提示符运行所有三行并再次检查文件,所有信息都已更改!

答案1

问题很可能出sudo在每行开头的部分。 sudo暗示“以 root 身份运行”。您可能会发现,实际上,您在命令行中登录的帐户已设置为/etc/sudoers从命令行运行,但不是通过 PHP 脚本运行 - 事实上,当您通过 Web 用户运行它时,您需要考虑这一点的含义 - Web 用户可能不会被设置/etc/sudoers- 也不应该!

您可以通过将文件的所有权更改为您自己并运行脚本来测试此理论sudo。要更改文件所有权,只需chown filename.ext

我认为你会更好:

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

相关内容