【问题标题】:Shell not recognizing aliased commandsShell 无法识别别名命令
【发布时间】:2011-08-12 06:20:59
【问题描述】:

我正试图追踪一个 Wordpress 网站是如何不断被黑客入侵的,我试图追踪的其中一件事是“触摸”命令正在命中哪些文件以伪造 last_modified 日期(许多黑客都会这样做)隐藏自己并在这种情况下发生)。我创建了一个名为 newtouch 的脚本,它简单地用时间戳记录发送给它的所有参数,然后将 touch 别名为 newtouch。这在我 ssh 时工作正常,但是当我尝试从 php 调用它时,它无法识别别名。我做了一些研究,发现这是因为 php 在不同的 shell 下运行:

$ php -r 'echo shell_exec("echo $0");' 嘘

主目录中没有 .profile,所以我创建了一个,但无论我在其中放入什么,由于某种原因我无法让 shell 识别它。为了测试,我尝试了一个名为 touch2 的简单别名,它简单地呼应了单词 test,并在 .profile 中尝试了以下所有内容,但都没有奏效:

alias touch2='echo test'

alias touch2 'echo test'

touch2 () {
    echo test
}

无论我尝试哪种方法,我都会得到相同的结果:

$ sh
$ alias
$ touch2
sh: touch2: command not found

$ php -r 'echo shell_exec("alias");'
$ php -r 'echo shell_exec("touch2");'
sh: touch2: command not found

感谢您的帮助,谢谢。

【问题讨论】:

  • 您的个人别名对新用户的系统没有任何意义(特别是如果他们已经获得 root 权限)或碰巧以 /path/to/touch/exec 执行 touch
  • 如果你为 shell 用户设置了一个别名命令,它不会阻止直接调用 /usr/bin/touch(绕过别名)和 php-internal touch() 函数(这更有可能是反正用过)。
  • 你们回答的很快,帖子只写了一半,但我在添加标签时不小心提交了,对此感到抱歉。此外,这肯定是通过 php 完成的,而不是通过另一个 shell。
  • @mvandemar:如果不是交互式 shell,则不会读取 .profile.bashrc。您需要设置BASH_ENV= 来强制执行脚本。在系统范围内设置它以产生任何效果。还要确保它实际上是 bash 而不是 dash 或其他最小化的 shell。
  • 好吧,SetEnv 在您的 .htaccess 中也可能有用。

标签: php shell alias .profile


【解决方案1】:
#!/path/to/bash

mv /path/to/touch /some/where/else
chmod -x /some/where/else/touch
chown root:root /some/where/else/touch
mv /path/to/new/touch /where/touch/was/before 

【讨论】:

  • 我没有root权限,是DreamHost上的共享主机环境。