【问题标题】:Run shell command and send output to file?运行shell命令并将输出发送到文件?
【发布时间】:2013-06-28 03:07:38
【问题描述】:

我需要能够通过 php 脚本修改我的 openvpn 身份验证文件。我已将我的 http 用户设置为不通过 sudoer,因为这台机器仅在我的家庭网络中可用。

我目前有以下命令:

echo shell_exec("sudo echo '".$username."' > /etc/openvpn/auth.txt");
echo shell_exec("sudo echo '".$password."' >> /etc/openvpn/auth.txt");

但在运行时,它们根本不会更改文件,也不会在 php 中提供任何输出。

我该如何进行这项工作?

【问题讨论】:

  • 你不能使用 file_put_contents 吗?
  • @marabutt:权限不允许
  • 如何运行脚本?
  • @zerkms:从浏览器运行,通过 lighttpd 和 php-fpm
  • 啊!成功!到文件的管道没有作为 sudo 运行,只有 echo 命令!由echo shell_exec("sudo sh -c 'echo \"username\" > /etc/openvpn/auth.txt'"); 修复,以 root 身份运行新的 shell,然后在其中运行命令。

标签: php linux bash


【解决方案1】:

您可以以 root 身份运行副本,而不是以 root 身份运行整个 shell 进程,这可以说是不安全的:

(使用 bash):

sudo cp <(echo "$username") /etc/openvpn/auth.txt

(应该适用于任何外壳):

echo "$username" | sudo dd of=/etc/openvpn/auth.txt

【讨论】:

  • 我知道这会给我用户名,但文件必须是两行,用户名在一个,密码在另一个......我该怎么做,而不能追加?
  • @GregSchoppe:{echo foo; echo bar; } | dd of=/path/to/file 。或者只是将整个字符串(包括换行符)放在引号之间:echo "foo&lt;newline&gt;bar",如果您使用 php.ini 生成命令行,这应该很容易。如果你真的需要追加并且你正在使用 GNU dd:dd of=/path/to/file conv=notrunc oflag=append.
【解决方案2】:

当你运行时

sudo command > file

只有命令作为 sudo 运行,而不是重定向。

正如您所指出的,sudo sh -c "command &gt; file" 会起作用。但是,除非您真的想以 sudo 的身份运行 command,否则您不应该这样做。您只能将重定向部分作为 sudo 运行。 rici 的答案涵盖了两种方法。这是另一种方法:

command | sudo tee filename >/dev/null #to overwrite (command > file)
command | sudo tee -a filename >/dev/null # to append (command >> file)

【讨论】:

  • 我应该将此作为评论添加到其他选项,但我已经输入了这个答案的一半。所以贴在这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多