我有一个 Web 应用程序,我在服务器上创建了一些文件夹并将可执行文件放在那里。然后我尝试使用 chroot 运行它们,但收到一条消息,提示访问被拒绝。
我尝试了一下chmod -R 777 blah blah....
,然后收到一条消息,提示我调用的文件夹或文件(sudo chroot mydirectory myfile_inside_Mydirectory)不存在。只有当我在 Web 服务器创建的文件夹上调用 chroot 时才会发生这种情况。我的 Web 应用程序使用 php,我使用:
shell_exec("cp -R /var/www/comp/prison/bin $dir");
shell_exec("cp -R /var/www/comp/prison/lib $dir");
shell_exec("cp /var/www/janitor.out $dir/janitor.out");
shell_exec("sudo chmod -R 777 $dir");
$process = proc_open("sudo chroot $dir janitor.out", $descriptorspec, $pipes);
sudo 不需要密码。
答案1
好吧,我终于发现我将所需的库复制到了错误的文件夹,因为当我第一次测试 chroot 时,我在一台 32 位 Ubuntu 机器上,而我的服务器是 64 位的。因此,我将所需的库和 bin/sh 复制到我想要锁定的目录中的正确文件夹中,它工作得很好。:D 谢谢大家!
答案2
janitor.out 是什么类型的文件?如果它是动态链接的,您还需要链接库,而链接库又可能需要其他库。您可以使用该ldd
程序检查需要哪些共享库。例如,输出ldd /bin/ls
:
linux-vdso.so.1 => (0x00007fffac983000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00007f8adda8f000)
librt.so.1 => /lib/librt.so.1 (0x00007f8add887000)
libacl.so.1 => /lib/libacl.so.1 (0x00007f8add67e000)
libc.so.6 => /lib/libc.so.6 (0x00007f8add2fb000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f8add0f7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8addccc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f8adced9000)
libattr.so.1 => /lib/libattr.so.1 (0x00007f8adccd4000)
并且ldd /lib/libacl.so.1
: linux-vdso.so.1 => (0x00007fffd462f000) libattr.so.1 => /lib/libattr.so.1 (0x00007f4e348aa000) libc.so.6 => /lib/libc.so.6 (0x00007f4e34527000) /lib64/ld-linux-x86-64.so.2 (0x00007f4e34cd6000) 如果其中一个库不满足,程序将报告“没有这样的文件或目录”,即使程序本身存在。
编辑:在这种情况下,以下更可能是问题所在。我保留上述答案,因为它可能对遇到相同错误消息的人有所帮助。
你在跑步:
sudo chroot $dir janitor.out
janitor.out
这将导致 chroot在 (/bin、/sbin、...) 中搜索$PATH
。您需要在 janitor.out 前面加上斜杠才能运行janitor.out
位于 chroot 根目录中的:
sudo chroot $dir /janitor.out