php中shell_exec的问题

时间:2016-10-17 14:36:16

标签: php html powershell

我有一个带有PHP的HTML表单来执行PowerShell脚本。

除了textarea输入字段外,一切正常。如果我在textarea框中执行单行文本,它可以正常工作并启动PowerShell脚本。如果我插入多行文本,包括回车符,它只会占用第一个单词/行并删除其余部分。

以下是启动PowerShell脚本的命令:

在textarea框中有一个单词:

 powershell -command file.ps1 -textarea 'test'

框中有多个单词

powershell -command file.ps1 -textarea 'firstword

如上所示,当TextArea字段中有多行时,它将删除它并仅发送第一个单词。这会导致PowerShell脚本失败,因为缺少终结器。

有什么想法吗?

以下是代码:

if($isValid) {
$customerid     = $_POST["DLState"];
$changesubject  = $_POST['subject'];
$starttime      = $_POST['starttime'];
$endtime        = $_POST['endtime'];
$changedetails  = $_POST['details'];
$psScriptPath   = "*****";

$query = shell_exec("powershell -command $psScriptPath -username '$user' -subject '$changesubject' -orgid '$customerid' -textarea '$changedetails' -edt '$endtime' -sdt '$starttime' < NUL");
  }

HTML文本区域标记

<textarea id="txtarea" name="details" cols="40" rows="6"></textarea>

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的脚本,并且所有这些username / subject / orgid / etc都是$ psScriptPath的脚本属性,那么您可以尝试以这种方式运行它:

  $query = shell_exec("powershell -command &quot;& {$psScriptPath -username '$user' -subject '$changesubject' -orgid '$customerid' -textarea '$changedetails' -edt '$endtime' -sdt '$starttime'}&quot;");

至少这对我很有用:

测试脚本:

PS C:\> gc c:\1.ps1
param($App)
& $App

从CMD shell调用:

C:\powershell -noprofile -command "& {c:\1.ps1 -App 'Notepad.exe'}"

答案 1 :(得分:0)

看起来像windows shell不喜欢回车符/换行符,所以我对base64进行了编码,然后在进入PowerShell后对其进行解码。一切都好。

$changedetails  = $_POST['details'];
$changedetailsencoded = base64_encode($changedetails);