PHP通过带有特殊字符的SSH传递shell命令


PHP passing shell commands over SSH with special characters

我通过SSH将动态shell命令传递给使用ssh2库的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文件句柄中的用户输入提供给它。

如果您需要一个如何使用它的示例:https://stackoverflow.com/a/2390755/664364

PS。我希望你知道你在做什么,允许用户作为Web服务器用户运行任意命令!