在 chroot 中执行命令的 Shell 脚本

18

如果在shell脚本中我写下:

chroot /home/mayank/chroot/codebase
cd SBC

当我运行这个shell脚本时,它确实进入了chroot但没有执行命令cd SBC,当我退出chroot时,它才执行cd SBC

如何通过shell脚本实现在chroot中执行命令的目的?


2
尝试使用chroot /home/whatever "COMMAND"命令。chroot后面可以跟命令。 - Kent
1
chroot /home/whatever "COMMAND"我甚至尝试了这个命令,实际发生的是它没有进入 chroot,但成功执行了“COMMAND”命令。 - Mayank Kataruka
此外,我有许多命令需要在chroot下运行。一定有办法吧? - Mayank Kataruka
COMMAND 可以在 chroot 中执行脚本。 - stark
2个回答

18

当你运行chroot命令时,如果没有指定具体执行内容,它会尝试启动一个在chroot环境下的交互式shell会话。因此,在这个点上,你的脚本会“暂停”,直到你完成该交互式shell会话后,它才会跳出chroot环境继续执行。

其中一个快速而且不太正规的方法是滥用here-document,像这样:

chroot /home/mayank/chroot/codebase /bin/bash <<"EOT"
cd /tmp/so
ls -l
echo $$
EOT

该命令将所有行直到EOT全部读入,并通过chroot启动的bash进行处理。那些围绕在"EOT"周围的双引号将确保bash传递内容时不会尝试扩展变量等内容。因此,echo $$应该是被chroot限制的内部bash的PID。


有没有一种方法可以扩展某些变量? - Andrey Reeshkov
2
@AndreyReeshkov,你可以像提到的那样使用<<EOT,但是在调用shell时会进行常规处理(参数扩展、命令替换、算术扩展),因此你必须转义所有要传递给子进程的内容。 - Ondrej K.
很好的帖子!我也遇到了同样的问题,但我还找到了另一种利用 Python 交互的方式,供你参考。 https://dev59.com/TWkw5IYBdhLWcg3wwNN5 - kyc1109

3

我找到了一个解决方案,

在chroot之后,我提供了一个脚本,它对我来说运行良好。

test.sh位于chroot文件夹中。 test.sh中的所有命令将在chroot文件夹中执行。

所以基本上是在chroot之后给出一个命令。

man chroot

chroot [OPTION] NEWROOT [COMMAND [ARG]...]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接