docker - 建立从 Jenkins 容器到 SSH 服务器容器的 SSH 连接,我可以用密码登录建立但不能用私钥建立
问题描述
故事:
我正在学习 Udemy 课程,以使用 docker 学习 Jenkins。实验室是我设置了一个SSH 服务器容器和一个Jenkins 容器,将它们放在同一个 docker 网络中。然后,我进入 jenkins 容器与 SSH 服务器容器建立 ssh 连接。
问题:
我可以使用密码登录建立从 jenkins 容器到 SSH 服务器容器的 SSH 连接,但是,它无法SSH -i
使用我生成的密钥对建立连接。
我的目录和文件的概述:
在我本地机器的工作空间下,我有:
- 一
docker-compose.yml
(详情见下文) - 一个名为 的目录
centos/
, - 在里面
centos/
我有一个Dockerfile
用于构建 SSH 服务器映像。
我尝试的步骤及其结果:
第 1 步,我首先docker-compose.yml
为这两个容器创建了
version: '3'
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
ports:
- "8080:8080"
volumes:
- $PWD/jenkins_home:/var/jenkins_home
networks:
- net
remote_host:
container_name: remote_host
image: remote-host
build:
context: centos7
networks:
- net
networks:
net:
正如您在上面看到的,该remote_host
服务指的是从Dockerfile
下centos/
目录构建的 SSH 服务器映像。
第2步,所以这是我的Dockerfile
下centos/
:
FROM centos
RUN yum -y install openssh-server
RUN useradd remote_user && \
echo remote_user:1234 | chpasswd && \
mkdir /home/remote_user/.ssh && \
chmod 700 /home/remote_user/.ssh
COPY remote-key.pub /home/remote_user/.ssh/authorized_keys
RUN chown remote_user:remote_user -R /home/remote_user/.ssh/ && \
chmod 600 /home/remote_user/.ssh/authorized_keys
RUN ssh-keygen -A
RUN rm -rf /run/nologin
CMD /usr/sbin/sshd -D
第 3 步。正如您在上面的 Dockerfile 中看到的,我从本地主机到容器COPY
的公钥并将其命名为。我通过命令在本地主机的文件夹下生成了密钥对:remote-key.pub
authorized_keys
centos/
ssh-keygen -t rsa -m PEM -f remote-key
第 4 步。完成以上所有操作后。我运行命令docker-compose build
来构建图像。
第 5 步。最后我运行docker-compose up
以调出容器。
jenkins 和 remote_host(ssh 服务器)容器都已启动并成功运行。
第 6 步。然后我通过 进入 jenkins 容器docker exec -it jenkins bash
,在容器的 bash 终端中,我进行 ssh 连接:
jenkins@7551f2fa441d:/$ ssh remote_user@remote_host
remote_user@remote_host's password:
输入密码 1234(定义在 中Dockerfile
)后,我成功建立了 jenkins 容器到 SSH 服务器容器的 SSH 连接。但我想通过密钥对而不是密码登录建立连接。
第7步,由于SSH服务器容器已经复制了公钥,所以我通过命令将私钥从本地主机复制到jenkins容器:
docker cp remote-key jenkins:/tmp/
因此,现在 jenkins 容器的 /tmp/ 目录包含私钥。
第 8 步,现在我尝试使用私钥建立与 ssh 服务器容器的 SSH 连接。我通过 进入詹金斯docker exec -it jenkins bash
,然后,我运行命令:
jenkins@7551f2fa441d:/$ ssh -i /tmp/remote-key remote_user@remote_host
Load key "/tmp/remote-key": Permission denied
remote_user@remote_host's password:
如上所示,在 jenkins 容器中,bash 提示符告诉我key "/tmp/remote-key": Permission denied.
Right 之后它要求我输入密码,然后我输入密码 1234,SSH 连接建立。
那么,为什么我不能使用私钥建立从 jenkins 容器到 ssh 服务器容器的 SSH 连接,而只能使用密码登录呢?
==== 更新 =====
受到@agentsmith 在他回答下的评论的启发,我检查了/tmp/remote-key
我的詹金斯容器内部的所有权:
drwxr-xr-x 2 jenkins jenkins 4096 Sep 20 13:01 hsperfdata_jenkins
drwxr-xr-x 2 root root 4096 Feb 2 2020 hsperfdata_root
drwxr-xr-x 2 jenkins jenkins 4096 Sep 20 13:01 jetty-0_0_0_0-8080-war-_-any-190970179478026794.dir
drwxr-xr-x 2 jenkins jenkins 4096 Sep 18 20:55 jetty-0_0_0_0-8080-war-_-any-878046537266404011.dir
-rw------- 1 245867976 1349604816 1679 Sep 18 20:53 remote-key
-rw-r--r-- 1 jenkins jenkins 3167976 Sep 18 20:55 winstone3001500689590881345.jar
-rw-r--r-- 1 jenkins jenkins 3167976 Sep 20 13:01 winstone8218655308653013358.jar
正如您在上面看到的,除了远程密钥jenkins
文件之外,所有其他文件都拥有(一个文件)的用户和组所有权。因此,我尝试通过以下方式更改所有权:root
jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key
chown: changing ownership of '/tmp/remote-key': Operation not permitted
但是该chown
命令告诉我不允许操作。:( 我现在该怎么办?
解决方案
-rw------- 1 245867976 1349604816 1679 Sep 18 20:53 remote-key
jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key chown: changing ownership of '/tmp/remote-key': Operation not permitted
但是 chown 命令告诉我不允许操作。:( 我现在该怎么办?
看起来您的 SSH 密钥的权限确实设置不正确。您无法更改文件权限,因为它归用户所有,245867976
但您的 bash 会话由jenkins
用户运行。
您应该使用以下方法更改文件所有权密钥root
:
docker exec -it -u root jenkins bash
$ chown jenkins:jenkins /tmp/remote-key
$ exit
-u
flag 将以用户身份bash
在jenkins
容器中运行root
,您应该可以使用该用户更改文件权限。然后再试一次:
docker exec -it jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
注意:您也可以直接运行ssh
withroot
而无需更改权限
docker exec -it -u root jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
推荐阅读
- python - Python键盘记录器不记录UA提示击键
- java - 无法在 java 动态项目中使用上下文根加载图像
- python - 如何在python中围绕一个圆圈绘制圆形统计的概率密度函数?
- process - 是否可以在银行家算法运行时添加具有非零资源需求的新进程而不会引入死锁?
- django - Git db.sqlite 和 wsgi.py 文件在拉取时不断恢复
- c# - 基于环境的 Appsettings.json 不加载
- python - python QMediaPlayer 发布资源
- python-3.x - Pygame - 不存在“设置”文件,正在运行“buildconfig/config.py”
- python - 为什么我不能安装 pyler 模块?
- javascript - 如何仅使用 CSS 选择类的第一个实例?