此docker命令将我的ssh密钥和用户名注入到容器中,将该容器连接到远程主机,然后在主机上运行:echo hello world
:
docker run --rm \
-e "host=the.host" \
-e "user=my.user.name" \
-v "/home/me/.ssh/id_rsa:/key" \
ubuntu:18.04 /bin/bash -c \
'apt update && apt install -y ssh \
&& ssh -o StrictHostKeyChecking=no $user@$host -i /key
echo hello world'
我希望该命令能够连接到远程主机,但我不希望它能够cat /key
并查看我的ssh密钥。
我可以进行哪些更改来实现这一目标?
我正在写一个测试跑步者。我的代码负责确定可以针对哪些主机运行哪些测试,但是测试本身可能不是我编写的(当我的测试运行程序启动时,它会从git repo中拉进来)。
我不担心我的同事滥用其测试代码来滥用服务器,因为这种滥用在源代码控制中可见。在这种情况下,它们是半信任的。我我担心某人编写的测试会导致我的ssh密钥出现在日志输出中的某个地方。
理想情况下,我会先建立ssh连接,然后创建容器-以某种方式授予它访问连接的权限,但不授予密钥的访问权限。
答案 0 :(得分:0)
我需要的功能是SSH Multiplexing,我了解到here
此文件位于~/.ssh.config
的docker映像中
Host foo
HostName foo.bar.com
User my.user.name
ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
此文件在主机上:
Host foo
HostName foo.bar.com
User my.username
IdentityFile /path/to/key
IdentitiesOnly yes
ControlMaster auto
ControlPath ~/.ssh/cm_socket/%r@%h:%p
我将图像称为keylesssh
,因此此命令创建了一个容器,该容器没有有密钥,但是确实具有包含一个密钥的文件夹。套接字(如果存在现有连接)。
docker run --rm \
-v "/home/matt/.ssh/cm_socket:/root/.ssh/cm_socket" \
keylesssh /bin/bash -c 'ssh dev1 hostname'
它像这样在一起:
我知道它是有效的,因为hostname
命令可解析远程服务器的主机名,而不是容器或Docker主机的主机名。