首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >busybox shell不知道任何命令

busybox shell不知道任何命令
EN

Stack Overflow用户
提问于 2022-07-04 22:52:44
回答 1查看 532关注 0票数 2

总结:在维护者Docker容器中的Busybox "sh“中不存在任何命令。

细微差别,一如既往:

有一个维护者工具映像,我想让shell访问。为什么我需要壳牌进入那里?这是因为我希望通过附加的docker套接字文件映射来发现连接多个坞上下文的能力(默认情况除外)。

维护者开发人员采取了一些步骤(他们说是出于安全原因)来禁用在正在运行的容器中获取交互控制台的能力--没有bin/bashbin/sh等。

我从https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/busybox下载了Busybox

并根据原始维护者一个创建了自己的调试容器:

Dockerfile:

代码语言:javascript
复制
FROM portainer/portainer-ce:2.9.3
LABEL destiny="Portainer debug"

ADD busybox busybox
ENTRYPOINT [""]
CMD [""]

执行图像生成命令:

代码语言:javascript
复制
docker build -f Dockerfile -t portainer_debug:latest .

..。然后用它启动一个容器:

代码语言:javascript
复制
docker run --name ppp -it portainer_debug /busybox sh

我进入了正在运行的容器内的一个外壳。不幸的是,我发现没有可用的命令。例如,ls命令返回:

代码语言:javascript
复制
/ # ls
sh: ls: not found
/ # 

这也意味着Busybox命令(上面的sh)在容器启动时充当参数。我用"ls“作为调情词检查了一下:

代码语言:javascript
复制
$ docker run --name ppp -it portainer_debug /busybox ls
busybox         docker-compose  kubectl         sys
data            etc             portainer       tmp
dev             helm            proc
docker          kompose         public
$

注意:“退出”命令在"sh“中工作。

与高山图像相同的摘录也如预期的那样工作:

代码语言:javascript
复制
/ # ls
bin      busybox  dev      etc      home     lib      media    mnt      opt      proc     root     run      sbin     srv      sys      tmp      usr      var
/ # 

如果有人能提出下一步的建议,我会很高兴和非常感激,以理解为什么busybox“忘记”所有命令。

EN

回答 1

Stack Overflow用户

发布于 2022-07-04 23:13:59

来自https://busybox.net/downloads/BusyBox.html

使用

BusyBox是一个多调用二进制文件.多调用二进制程序是一个可执行程序,它执行与多个实用程序相同的工作。这意味着只有一个BusyBox二进制文件,但是单个二进制文件的作用类似于大量的实用程序。这允许BusyBox更小,因为所有内置的实用程序(我们称之为applet)都可以共享许多常见操作的代码。

还可以通过在命令行上发出作为参数的命令来调用BusyBox。例如,输入

/bin/busybox ls

也会导致BusyBox表现为'ls‘。

当然,在每个命令中添加'/bin/busybox‘将是痛苦的。因此,大多数人将使用指向BusyBox二进制文件的链接来调用BusyBox。

例如,输入

-s /bin/busybox ls ./ls

将导致BusyBox表现为'ls‘(如果'ls’命令已编译为BusyBox)。一般来说,您不需要自己创建所有这些链接,因为在运行“make”命令时,BusyBox构建系统将为您提供这些链接。

如果您调用没有参数的BusyBox,它将为您提供已编译到BusyBox二进制文件中的小程序列表。

您只将二进制busybox复制到图像中。您可以执行./busybox ls或创建符号链接,如果希望shell找到它们,则可以将带有符号链接的目录添加到$PATH

为什么busybox“忘记”所有命令。

Busybox没有“忘记”任何东西,它是无生命的,你只是没有正确地使用。

例如,下面是:

image.

  • Because我很懒,我不写一个Dockerfile,我只是把安装在主机上的busybox可执行文件挂载到了码头容器中。与container.

  • The中的复制相同,容器执行/busybox sh shell
  • -c,后者执行脚本
  • 脚本为每个工具创建目录/busybox mkdir /bin
  • the脚本- for i in $(/busybox list)
    • /bin目录- /busybox ln -s /busybox /bin/$i

中的busybox可执行文件创建一个符号链接

代码语言:javascript
复制
- the above two steps are exactly as explained in Busybox faq [https://busybox.net/FAQ.html#getting\_started](https://busybox.net/FAQ.html#getting_started)
- then the script executes an interactive shell to interact with me

因为在PATH中/bin是默认的,在创建目录和符号链接之后,所有Busybox工具都是可用的。注意,在创建带有符号链接的PATH目录之前,所有命令都预先加上了/busybox,以方便上面文档中解释的Busybox调用。

代码语言:javascript
复制
$ docker run -ti --rm --entrypoint '' -v /bin/busybox:/busybox:ro portainer/portainer-ce:2.9.3 /busybox sh -c '/busybox mkdir /bin; for i in $(/busybox --list); do /busybox ln -s /busybox /bin/$i; done; sh -li'
/ # ls
bin             data            docker          etc             kompose         portainer       public          tmp
busybox         dev             docker-compose  helm            kubectl         proc            sys
/ # echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72862614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档