Lee*_*fin 4 ssh centos jenkins docker dockerfile
故事:
我正在学习 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:
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,该服务指的是从下面的目录remote_host构建的 SSH 服务器映像。Dockerfilecentos/
第 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
Run Code Online (Sandbox Code Playgroud)
步骤 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:
Run Code Online (Sandbox Code Playgroud)
输入密码1234(在 中定义Dockerfile)后,我成功建立了从jenkins容器到SSH服务器容器的SSH连接。但我想通过密钥对而不是密码登录建立连接。
第7步,由于SSH服务器容器已复制公钥,因此,我通过命令将私钥从本地主机复制到jenkins容器:
docker cp remote-key jenkins:/tmp/
Run Code Online (Sandbox Code Playgroud)
所以,现在 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:
Run Code Online (Sandbox Code Playgroud)
正如您在上面看到的,在 jenkins 容器内,bash 提示符告诉我key "/tmp/remote-key": Permission denied.然后它要求我输入密码,然后我输入密码 1234,SSH 连接就建立了。
那么,为什么我无法使用私钥建立从 jenkins 容器到 ssh 服务器容器的 SSH 连接,而只能使用密码登录呢?
====更新=====
/tmp/remote-key受到 @agentsmith 在他的回答下的评论的启发,我检查了jenkins 容器内部的所有权:
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
Run Code Online (Sandbox Code Playgroud)
正如您在上面所看到的,除了远程密钥jenkins文件之外,所有其他文件都具有(一个带 的文件root)的用户和组所有权。所以我尝试通过以下方式更改所有权:
jenkins@7551f2fa441d:/$ chown jenkins:jenkins /tmp/remote-key
chown: changing ownership of '/tmp/remote-key': Operation not permitted
Run Code Online (Sandbox Code Playgroud)
但是该chown命令告诉我不允许操作。:( 我现在应该怎么做?
Run Code Online (Sandbox Code Playgroud)-rw------- 1 245867976 1349604816 1679 Sep 18 20:53 remote-key
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
-uflag 将以用户身份bash在jenkins容器中运行root,您应该能够更改文件权限。然后再试一次:
docker exec -it jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
Run Code Online (Sandbox Code Playgroud)
注:也可以直接运行ssh,root无需更改权限
docker exec -it -u root jenkins bash
$ ssh -i /tmp/remote-key remote_user@remote_host
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7830 次 |
| 最近记录: |