能否通过某方式使 ssh 客户端连接到 docker 某容器内的 bash?

2019-04-02 22:24:29 +08:00
 leoleoasd

如题 想做到的效果是: ssh 客户端连接 docker 宿主机某端口 看到的内容是宿主机(根据用户名决定的某容器)内的 /bin/bash

想过用 python api 转发 docker exec 的结果 但是这样子的话不支持类似 top 或者 vi 这样交互式的程序

2693 次点击
所在节点    问与答
25 条回复
neighbads
2019-04-02 22:54:17 +08:00
用端口好区分 用用户名就费劲了。
Alliot
2019-04-03 00:18:24 +08:00
docker 里面跑个 sshd (逃
yingyue
2019-04-03 00:27:20 +08:00
我觉得 2 楼方法最好
cxyfreedom
2019-04-03 00:29:40 +08:00
只能容器里面跑 sshd 吧,不然怎么 ssh (
zeromake
2019-04-03 00:48:25 +08:00
可以看看我的 docker 小工具怎么处理 docker exec 的输入输出。github 的`zeromake/docker-debug`

看不来 go 可以去看看 docker-compose 的 py 实现。
然后找个 ssh server 实现库重定向输入输出到 ssh 里
ETiV
2019-04-03 01:27:03 +08:00
authorized_key 的配置语法可以去了解一下

ssh-rsa 前面可以加 no-tty、no-port-forwarding 等等这些

但它还有个 command 指令( GitHub 之类的就是用它来鉴权的):
我们这里貌似用 command="docker exec -ti container /bin/bash" 就可以了,你可能要自己多试试

docker terminal window 有它自己的 size,所以这么连上去可能挺难用的(可能字符会胡乱折行)(印象中有个 docker resize 命令?)

然后当用户通过这个对应的 key 连上来,就会执行 command 制定的命令
ResidualBlood
2019-04-03 07:02:19 +08:00
frp 可实现,虽然有点另辟蹊径。。。
catalina
2019-04-03 07:12:38 +08:00
@Alliot 这方法不是挺不错的嘛
leoleoasd
2019-04-03 08:01:04 +08:00
@ETiV #6 这个 command 是否会覆盖 /etc/passwd 中的设置?
比如我为了安全期间 /etc/passwd 中设置为 nologin 然后 command 写 docker exec
leoleoasd
2019-04-03 08:24:59 +08:00
@zeromake #5 这样子的话容器内的程序 如 vi 能否读取到窗口的长宽?
leoleoasd
2019-04-03 08:25:41 +08:00
@cxyfreedom #4 ssh 链接主机 主机转发到 docker exec 中的 bash 里
问题是那种 vi 啥的 docker 内的程序怎么读取 ssh 客户端的窗口大小
yuikns
2019-04-03 08:40:19 +08:00
CMD ["/usr/sbin/sshd", "-D"]

可解决。

不过有时候有些系统需要 hack 下。

RUN ssh-keygen -A ; \
mkdir -p /var/run/sshd ; \
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd ; \
sed 's@#UseDNS yes@UseDNS no@g' -i /etc/ssh/sshd_config # prevent stucks here >> SSH2_MSG_SERVICE_ACCEPT received

docker 里面 22 端口转出去即可。

ssh 的话,vi 读窗口大小和这貌似没关系。这个就是 ssh 帮忙转发全局环境变量 COLUMNS LINES TERM 等。
你 echo $LINES 可以看到。
kaneg
2019-04-03 08:48:25 +08:00
可以参照我做的一个个人项目 httpshell,类似 ssh,但可以自定义需要执行的命令。
AngryPanda
2019-04-03 08:48:46 +08:00
先 ssh 到宿主机,然后执行 docker exec bash
yuikns
2019-04-03 08:49:17 +08:00
@yuikns 额,刚才搜了下,我后面记忆中的环境变量是错误的。抱歉丢人了...
yuikns
2019-04-03 08:50:38 +08:00
另外,要是想要远程跑 python,jupyter notebook 也是个可选项。多用户用 jupyterhub 什么的也很好用
leoleoasd
2019-04-03 09:10:42 +08:00
@ETiV #6 刚测试了下这样子用 VI 换行是没有问题的
zeromake
2019-04-03 09:18:53 +08:00
@leoleoasd #10 docker 自己有个 resize 接口就是用来处理这个的
leoleoasd
2019-04-03 09:42:01 +08:00
@yuikns #12 我目前需要的效果是不在 docker 内跑 sshd
6 楼给的方法我测试了下春耕拱了
leoleoasd
2019-04-03 09:42:14 +08:00
@yuikns 成功了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/551436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX