我试图用PHP shell_exec函数运行su命令。 起初我试过:
<?php echo(shell_exec('echo \'password\' | su user -c \'whoami\' 2>&1;')); ?>
我得到了:
su: must be run from a terminal
然后我用python的pty读了关于产卵terminal并把它放到shell代码中:
<?php echo(shell_exec('echo "if [ -t 1 ] ; then echo "terminal found"; fi; echo \'password\' | su user -c \'whoami\'; exit" | python -c \'import pty; pty.spawn("/bin/bash")\' 2>&1;')); ?>
这里是输出:
if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami'; exit www-data@server:/some/directory$ if [ -t 1 ] ; then echo terminal found; fi; echo 'password' | su user -c 'whoami'; exit terminal found su: must be run from a terminal exit
任何想法,为什么pty不工作,或者我应该用什么其他工具来产生一个terminal? PHP在Debian上运行Apache。
编辑:我正在寻找一种解决scheme,不需要物理访问服务器或通过SSH连接。 假设我想用su启动sshd,只有工作服务器是FTP和Apache。
答案(而不是解决scheme)就是你不能 。
好的pipe理员将永远阻止它。 这是一个非常糟糕的主意,你知道你应该避免它,并使用一些更好的解决scheme。
例如通过PHP(FTP或其他方法)设置一个标志,
即安排一些行动(例如,重新启动SSH服务器),当一个特定的标志是通过PHP设置(例如文件存在,JSON响应或DB值)。
触发器可以来自PHP的任何东西,但关键在于,动作应该是预先定义的,并且具有可靠的预期结果,当php部分失败时(例如,当有人设法在未经您许可的情况下触发php部分) 。
另一种解决scheme可能是编写执行所需操作的bash脚本,设置无脚本访问这些脚本(在sudoers文件中)并通过php运行它们。
在Web服务器上通过PHP运行任何与su相关的东西是一个非常糟糕的主意。 这为服务器的妥协打开了太多的可能性。
如果某些特定的可执行文件需要以root身份运行,则可以使用sudo机制来执行此操作。 不幸的是configurationsudo需要付出很大的努力。
如果必须从你的php程序中使用su ,那么正确的方法是通过expect来使用它。 你可以使用一个小脚本:
#!/use/bin/expect -f spawn "su some_user -c cmd.sh" expect { ssword: { send "myStrongPass\r" } } interact
但是,您应该意识到这会产生安全风险 – 您将用户的明文密码存储在Web服务器可读的文件中。 那个用户可以访问sudo ..你应该仔细考虑一下。
我的朋友已经告诉我如何获得tty,然后苏。
<?php shell_exec('nc -l -p 1234 -c /bin/sh'); ?>
然后你必须在端口1234上telnet并input这些命令:
python -c 'import pty; pty.spawn("/bin/sh")' tty
它工作得很好。
不是直接运行su ,而是通过sudo运行它,确保你已经给Apache的用户权限去做没有密码的操作,所以它就像sudo su …一样简单。 你也可以(你最好)限制使用sudo模式匹配运行的sudo ,当然你也可以使用sudo本身而不使用su 。