PHP使用特殊字符通过SSH传递shell命令

PHP使用特殊字符通过SSH传递shell命令,php,bash,shell,special-characters,Php,Bash,Shell,Special Characters,我使用ssh2库通过SSH将动态shell命令传递给带有PHP的服务器。我传递的命令是注意,这只是一个示例,命令是动态的,由用户生成 $command = 'ls -al free -m'; 请注意换行符,这是必需的,因为用户可以使用换行符和制表符键入完整的bash脚本。然后,我执行以下操作来构建实际的命令以使用ssh2库执行: $command = str_replace("'", "\'", $command); $command = 'echo $\'' . $command . '\'

我使用ssh2库通过SSH将动态shell命令传递给带有PHP的服务器。我传递的命令是注意,这只是一个示例,命令是动态的,由用户生成

$command = 'ls -al
free -m';
请注意换行符,这是必需的,因为用户可以使用换行符和制表符键入完整的bash脚本。然后,我执行以下操作来构建实际的命令以使用ssh2库执行:

$command = str_replace("'", "\'", $command);
$command = 'echo $\'' . $command . '\' | bash';
最终命令如下:

echo $'ls -al
free -m' | bash
上面的命令直接在shell上执行得很好,但是当我使用ssh2从PHP执行它时,我得到:

ls: invalid option --  
Try `ls --help' for more information.
所以我想,肯定有一些特殊字符,或者美元符号没有被转义,所以我做了:

  print_r(bin2hex($command));
其结果是:

 6563686f2024276c73202d616c0d0a66726565202d6d27207c2062617368
将十六进制转换为ascii将返回正确的命令,但如上所述


知道是什么导致了这个错误吗?

这个错误来自bash,而不是PHP

当我在shell中尝试您的命令时,我得到了相同的错误

但是为什么要使用如此复杂的方式运行bash呢

而是使用proc_open,将bash作为命令,然后在stdin文件句柄中向其提供用户输入

如果您需要如何使用它的示例:


我希望你知道你在做什么,允许用户以Web服务器用户的身份运行任意命令

这是一个很长的故事来解释为什么它是这样设置。把安全放在一边。真的,当您复制并粘贴$command的内容时,会出现bash错误吗?我在CentOS没有,我有,是的。虽然误差是不同的。我得到ls:invalid选项-'e'我已经编辑了帖子,请阅读顶部以查看更好的解释。@Justin您的编辑没有改变任何东西-我仍然认为这是bash错误,而不是PHP错误。尝试改用proc_open。试试看!在ls后面加一个分号,观察它的工作情况。