[Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1066
  • Last Modified:

shell_exec not working with sed

Hi All,

I have the code below, that works in SSH, but not via shell_exec() in PHP.


Any idea?
$output = exec("sed -i 's/oldtext/newtext/g' /etc/postfix/virtual");

Open in new window

0
detox1978
Asked:
detox1978
  • 11
  • 8
1 Solution
 
detox1978Author Commented:
The sample code from php.net works.


<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>

Open in new window

0
 
sjklein42Commented:
Try quoting it this way:

<?php
$output = exec('sed -i \'s/oldtext/newtext/g\' /etc/postfix/virtual');
echo "<pre>$output</pre>";
?>

Open in new window

0
 
detox1978Author Commented:
no luck.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
sjklein42Commented:
I meant "shell_exec".

<?php
$output = shell_exec('sed -i \'s/oldtext/newtext/g\' /etc/postfix/virtual');
echo "<pre>$output</pre>";
?>

Open in new window

0
 
detox1978Author Commented:
no luck with shell_exec
0
 
detox1978Author Commented:
I found this code on the PHP.net website for returning the exit code.

It reruns a 4.  Any idea what that means?
<?php
$command = 'sed -i s/oldtext/newtext/g /etc/postfix/virtual'; 
// Execute the shell command 
$shellOutput = shell_exec($command.' > /dev/null; echo $?'); 
    
//return execute status; 
echo trim($shellOutput);
?>

Open in new window

0
 
detox1978Author Commented:
that should have said returns not reruns.
0
 
sjklein42Commented:
This is actually a killer of a problem that many have run into but none have solved that I could find.

Work around it by making a tiny script file containing your sed command, and then execute that script file using shell_exec instead of the naked sed command.

Does this work for you?
0
 
detox1978Author Commented:
I'm very new to this, could you give me a sample.

I would need to be able to pass variables.
0
 
sjklein42Commented:
Here's what I was thinking of.

Create a shell script file (mysedscript) with these lines:

#!/bin/bash

oldtext=$1
newtext=$2
whichfile=$3

sed -i 's/$oldtext/$newtext/g' $whichfile

Open in new window



Here's the php to call it.  You will need to put the right path in, of course.  And be sure to set Execute attribute on the script file.

<?php
$output = shell_exec('/path/to/my/script/mysedscript oldtext newtext /etc/postfix/virtual');
echo "<pre>$output</pre>";
?>

Open in new window

0
 
detox1978Author Commented:
It executes locally, but not via shell_exec.  It still returns the exit status of 4.
0
 
sjklein42Commented:
Does this get the same error?  (just echo the sed command but don't execute it):

#!/bin/bash

oldtext=$1
newtext=$2
whichfile=$3

echo sed -i 's/$oldtext/$newtext/g' $whichfile 

Open in new window

0
 
detox1978Author Commented:
no that returns a 0, which is the same as the working sample on php.net.
0
 
sjklein42Commented:
Tough one.  I hope you have patience with me if we try a few things.

Some of the bloggers have given up and use PHP to do the replace operation instead of sed but we're not quite there yet.

Let's assume for a minute that it is the "sed" command that is returning the 4 status.

I haven't been able to determine what "4" means in this context, but suspect it has to do either with (1) not able to find "sed" itself, or (2) not able to open the input file (virtual) either because of a path problem or a protection problem.

We may be able to narrow it down with a test.   Put a copy of the input file (virtual) in the same folder as the mysedscript script.  Change the whichfile argument in the php accordingly to point there instead of to /etc.  Also go back to the original (non-echo-test) version of mysedscript.

If this works, we know it has to do with file protection on virtual.

If not, I'm out of ideas right now.



0
 
detox1978Author Commented:
ok, I'll give that a go.

I'd happily use PHP, but the file isn't accessible from PHP is it?
0
 
detox1978Author Commented:
Interesting results.  the script works against a copy.
0
 
sjklein42Commented:
The php is running on the same machine as the virtual file, isn't it?
0
 
detox1978Author Commented:
I've got it working.  The folder it sits in needed write chmod.  I can now run it without the script and using;

sed -i s/oldtext/newtext/g /etc/postfix/virtual

0
 
sjklein42Commented:
I guess we should have thought of that first.

;)
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 11
  • 8
Tackle projects and never again get stuck behind a technical roadblock.
Join Now