配置ssh无密码登录docker container以及遇到问题的解决方案

我们利用的基础镜像是:centos7,所以在配置sshd的时候会遇见很多的大坑,很不幸,我已经全部踩到了。下面就来分享一下我的操作过程:

大致的流程分为三步:

1.    安装sshd-server并配置/etc/ssh/sshd.config文件

2.    配置/root/.ssh/config文件以跳过验证IP的过程

3.    启动sshd

由于我们操作的是docker container,其实我们可以将这些的配置过程写在Dockerfile中,在创建镜像的时候直接配置,我们也可以采用docker commit的方式来更新image。

安装sshd-server并配置/etc/ssh/sshd.config文件

安装openssh-server:利用yum指令来安装     

 yum install -y openssh-server

配置/etc/ssh/sshd.config文件:其中需要打开端口、监听地址、允许用户名密码登录,根据需要,我这里打开了允许root用户登录和免密码登录的配置。

sed -i "s/#Port 22/Port 22/g"/etc/ssh/sshd_config
sed -i "s/#ListenAddress0.0.0.0/ListenAddress 0.0.0.0/g" /etc/ssh/sshd_config
sed -i "s/#ListenAddress::/ListenAddress ::/g" /etc/ssh/sshd_config
sed -i "s/#PermitRootLoginyes/PermitRootLogin yes/g" /etc/ssh/sshd_config
sed -i "s/#PasswordAuthenticationyes/PasswordAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/#PermitEmptyPasswordsno/PermitEmptyPasswords yes/g" /etc/ssh/sshd_config

sshd启动以及遇到问题的解决方案

下面我们启动一下contianer中的sshd,如果您用serversshd start启动的时候,你就会踩到第一个坑,出现-bash: service: command not found错误,就算切换到root用户下面也不行,因为在/etc/sbin/下面就没有server,如果您用systemctlstart sshd来启动sshd,那么就会遇到Failed to get D-Bus connection: Operation not permitted的问题,在这个时候我们可以采用的方法是在启动docker的时候利用如下的指令:

docker run -d -e "container=docker"  --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup 221bb83b0bbe /usr/sbin/init
但是很明显,他需要挂载主机上的卷,并且启动init的命令,这很有可能会影响我们Dockerfile中的CMD的命令,所以,在这里我建议使用 /usr/sbin/sshd的启动方式,但是,很快我们就会遇见第二个坑,也就是会出现
error: Could not load host key: /etc/ssh/ssh_host_rsa_key

这样的错误,也就是sshd的守护进程不能加载主机密钥,这是因为主机密钥没有自动生成,所以我们可以利用/usr/bin/ssh-keygen –A指令来生成主机密钥,然后再利用/usr/sbin/sshd来启动sshd。

目前为止,我们可以在container中启动sshd并且外面的client端可以利用ssh登录上来,但是,很快我们又会遇见另一个问题,当我们把container rm掉的时候,再次启动,我们从相同的client端登录就会出现无法登陆的情况,也就是会出现这样的错误:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
50:e6:cb:58:bc:b7:a3:f6:e8:8f:46:a7:c1:5f:c2:df.
Please contact your system administrator.
Add correct host key in /root /.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:7
RSA host key for 192.168.0.4 has changed and you have requested strict checking.
Host key verification failed.

这是因为主机在检查IP密钥的时候发生冲突了,我们可以手动的到/root /.ssh/known_hosts的目录下面进行手动删除,但是这很不符合调度的自动户的策略,所以,我们需要配置/root/.ssh/config文件以跳过验证IP的过程。

配置/root/.ssh/config文件以跳过验证IP的过程

mkdir -p /root/.ssh
touch /root/.ssh/config
echo "StrictHostKeyChecking no" > /root/.ssh/config
sed -i "a UserKnownHostsFile /dev/null" /root/.ssh/config

简单的说,在/root/.ssh/condfig中添加两句配置语句即可,然后我们再次按照上面的方法启动sshd,我们就可以跳过IP检查并且无密码登录了。

 

注:一般情况下,我们会写一个死循环让docker container一直保持运行不退出。然后在启动的时候,利用指令:

docker run -d -p 222:22 a:v1

令docker container在后台运行着,并且我们将22端口映射到主机的222端口,也就是说,我们在登录的时候就可以采用:ssh –p 222 XXX(主机IP)的方式来登录。

以上过程均来自个人亲身体验,如有问题,欢迎大神们提出指导。











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值