Solved

shell_exec not working with sed

Posted on 2011-03-16
19
964 Views
Last Modified: 2012-05-11
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
Comment
Question by:detox1978
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 11
  • 8
19 Comments
 
LVL 2

Author Comment

by:detox1978
ID: 35152978
The sample code from php.net works.


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

Open in new window

0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153011
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153019
no luck.
0
Don't Cry: How Liquid Web is Ensuring Security

WannaCry is just the start. Read how Liquid Web is protecting itself and its customers against new threats.

 
LVL 16

Expert Comment

by:sjklein42
ID: 35153035
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153052
no luck with shell_exec
0
 
LVL 2

Author Comment

by:detox1978
ID: 35153064
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153089
that should have said returns not reruns.
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153100
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153109
I'm very new to this, could you give me a sample.

I would need to be able to pass variables.
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153198
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153267
It executes locally, but not via shell_exec.  It still returns the exit status of 4.
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153334
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153345
no that returns a 0, which is the same as the working sample on php.net.
0
 
LVL 16

Accepted Solution

by:
sjklein42 earned 500 total points
ID: 35153415
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
 
LVL 2

Author Comment

by:detox1978
ID: 35153424
ok, I'll give that a go.

I'd happily use PHP, but the file isn't accessible from PHP is it?
0
 
LVL 2

Author Comment

by:detox1978
ID: 35153441
Interesting results.  the script works against a copy.
0
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153446
The php is running on the same machine as the virtual file, isn't it?
0
 
LVL 2

Author Comment

by:detox1978
ID: 35153463
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
 
LVL 16

Expert Comment

by:sjklein42
ID: 35153498
I guess we should have thought of that first.

;)
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Utilizing an array to gracefully append to a list of EmailAddresses
Fine Tune your automatic Updates for Ubuntu / Debian
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question