【问题标题】:PHP passing shell commands over SSH with special charactersPHP通过带有特殊字符的SSH传递shell命令
【发布时间】:2012-09-06 01:23:31
【问题描述】:

我正在使用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 会返回正确的命令(完全如上)。

知道是什么原因造成的吗?

【问题讨论】:

    标签: php bash shell special-characters


    【解决方案1】:

    该错误来自 bash,而不是 PHP。

    当我在 shell 中尝试你的命令时,我得到了同样的错误。

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

    改为使用proc_open(),将bash 作为命令,然后将用户输入输入到标准输入文件句柄中。

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

    PS。我希望你知道你在做什么让用户以网络服务器用户的身份运行任意命令!

    【讨论】:

    • 要解释为什么要这样设置是一个很长的故事。安全不谈。真的,当您复制并粘贴 $command 的内容时,您会收到 bash 错误?我不在 CentOS 中。
    • 我愿意,是的。虽然错误不同。我得到ls: invalid option -- 'e'
    • 我已经编辑了帖子,请阅读顶部以查看更好的解释。
    • @Justin 您的编辑没有改变任何东西——我仍然认为这是一个 bash 错误,而不是 PHP 错误。尝试改用 proc_open。测试它!在 ls 之后添加一个分号并观察它的工作。
    猜你喜欢
    • 2018-04-29
    • 2013-09-01
    • 2019-06-24
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2013-10-22
    • 2013-08-24
    • 2015-11-22
    相关资源
    最近更新 更多