我通过SSH将动态shell命令传递给PHP
使用ssh2
库的服务器。我传递的命令是(注意这只是一个例子,命令是动态的,用户生成的)。
$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会返回正确的命令(完全如上所述)。
知道可能导致这种情况的原因吗?
答案 0 :(得分:0)
该错误来自bash,而不是PHP。
当我在shell中尝试你的命令时,我得到了同样的错误。
但是你为什么要使用这种令人费解的方式来运行bash?
而是使用proc_open()
,bash
作为命令,然后在stdin文件句柄中输入用户输入。
如果您需要一个如何使用它的示例:https://stackoverflow.com/a/2390755/664364
PS。我希望你知道你在做什么,允许用户以网络服务器用户的身份运行任意命令!