从php中的shell_exec运行sed命令

时间:2014-04-16 10:04:55

标签: php sed exec

请帮助我,因为我一直试图让它工作两天。

我有一个文本文件,其中包含用于定义用户名和密码的数组。

$USERS['user'] = 'pass1';

我正在尝试使用PHP来更改此密码

//name - call_pwd.php
$commandline='./change_password ' . $_SESSION["logged"] . " " . $_POST["old_password"] . " " . $_POST["new_password"] 
$output = shell_exec("$commandline");

以下是我更改此密码所使用的bash文件。因为我不擅长它,所以我必须使用这么多变量来轻松实现。

#!/bin/bash
#name - change_password
username=`echo "$1"`
old_password=`echo "$2"`
new_password=`echo "$3"`
old_string=`echo "\['$username'\] = '$old_password'"`
new_string=`echo "['$username'] = '$new_password'"`
sed -i "s/${old_string}/${new_string}/" passwords.php
if [ "$?" == 0 ]
then
echo "Password changed Successfully."
else
echo "Could not change password, try again."
fi

当我从根提示符运行此脚本时,它可以正常工作并更改密码。但是从PHP开始它将不起作用。它不断给我留言“无法更改密码,请再试一次。”

当我读“和'需要转义如果你想用sed和php一起使用

sed -i \"s/${old_string}/${new_string}/\" passwords.php
sed -i \""s/${old_string}/${new_string}/\"" passwords.php

passwords.php的权限是所有用户的完全权限。 我也试过把绝对路径放到各处,但这也没有用。

我的call_pwd.php上的$ output变量出现在我回显$ commandline $ old_string和$ new_string

的时候

change_password用户pass1 pass2

\['user'\] = 'pass1'
['user'] = 'pass2'
Could not change password, try again. 

请帮帮我。谢谢。 为这么长的帖子道歉。

1 个答案:

答案 0 :(得分:0)

你为什么这样做?您可以使用[un]serialize()file_[put/get]_contents()在PHP中执行所有操作。

$ php -r '
    $USERS = [ "user" => "pass1" ];
    file_put_contents("passwords.php", serialize($USERS));'
$ cat passwords.php; 
a:1:{s:4:"user";s:5:"pass1";}
$ php -r '
    $USERS = unserialize(file_get_contents("passwords.php"));
    $USERS["user"] = "newpass";
    file_put_contents("passwords.php", serialize($USERS));'
$ cat passwords.php
a:1:{s:4:"user";s:7:"newpass";}

我不会对这样做的安全含义发表任何评论,但是如果你只想在已经使用PHP时更改文本文件中的某些值,为什么不使用PHP呢?