Dash is not bash

在一些 docker 官方 Image 中,执行一些 .sh 文件的时候遇到了一些奇怪现象,比如:

1
2
3
# Run something like:
[[ $ABC =~ regexp ]]
#> [[: not found

其实是因为此 Image 中 sh 并非 bash,而是 dash:

1
2
ls -l /bin/sh
#> /bin/sh -> dash

此时,只需重置 sh 就好了:

1
2
rm /bin/sh
ln -s /bin/bash /bin/sh

不过,在 docker image 里,还是不建议执行 .sh 文件。所有事情都在 host 上完成,之后 -v 共享目录给 docker container 为好。

参考

Use SSH agent forwarding in your private network

大量云服务开始提供可供定制的私有网络功能来组织你所购买的 VPS,如果此时还通过直接链接每台机器的方式来管理,就太浪费资源和极为的不安全了。

以 qingcloud 产品为例,可以通过 GRE 隧道或者 VPN 等手段来实现安全登录和管理。但在一些条件不具备的情况下,采用内控堡垒主机(运维堡垒主机,Bastion Host)方案不失为一个好的方法。

将私有网络(内网)中的一台机器作为堡垒主机,将其 SSH 端口映射向公网某端口,打开该端口的防火墙 TCP 设置。此时,公网只能访问该堡垒主机,登录后,再通过该机登录其他服务器,从而即实现对了公网对其他服务器的隔离,有能够方便管理所有服务器。

方案容易,部署也不麻烦,但这里引发一个问题—— SSH Key 的问题。如果在堡垒主机上使用任何 Key 一旦堡垒主机被攻破,那么其他服务器就是“白给”状态,所以这里可以采用 SSH agent 来“中转” Key。

其实只要比常规方法多 -A 参数就可以实现 Key 中转了:

1
ssh -A user@your.server.ip

使用 SSH config 的话,增加 ForwardAgent 属性:

1
2
3
Host any_name_want
HostName your.server.ip
ForwardAgent yes

此时,访问内网的其他服务器时,形如:

local —- ssh -A —-> Bastion Host —- ssh —-> Server 1 / 2 / 3 /…

当然,在所有服务器上使用的都是你本地 Key 的公钥

但还没有结束,由于 Bastion Host 并不运行正在的服务,在其他服务器上需要部署服务,尤其是通过 git 这类方式部署的时候,又有 Key 的问题了,所以改进一下:

local —- ssh -A —-> Bastion Host —- ssh -A —-> Server 1 / 2 / 3 /…

是的,就是 SSH agent forwarding 两次。

OK,done!

主要实现摘自:
SSH agent forwarding 的應用