@
pubby 一开始的方案3肯定是改动最少的方案
ssh的ProxyCommand并非在跳板机上启动一个服务,而是调用netcat或者直接用ssh的built-in netcat mode将两端的IO转发。
把tunneling的脚本改了一个用ProxyCommand版本的
#!/bin/sh
proxy_ncmode='ProxyCommand ssh -W %h:%p bastion_serv'
proxy_nc='ProxyCommand ssh bastion_serv nc -w 10 %h %p'
rsync -avze "ssh -o \"$proxy_ncmode\"" ./tmp/ trapped_me:~/tmp
ssh -o "$proxy_nc" trapped_me uptime
# -- end of script
* bastion_serv 是中间hop跳板机
* trapped_me 是只能从跳板机ssh接入的远程机 (生产环境?)
脚本里两个mode都实验了一下:
* proxy_ncmode 参数是使用 ssh 的netcat mode连接
* proxy_nc 参数是使用 跳板机上的netcat转发,如果跳板机没有netcat,就必须使用 proxy_ncmode模式了。 nc -w 10 表示进程idle10秒后自动断开。
比起tunneling来,这个ProxyCommand mode 不需要对不同远程server指定不同端口转发啦。
(万一生产环境有百来台server呢?)。但前提是远程server们没有做ip限制-如果万一它们只许可 跳板server ip登录,那就只能做端口转发 - 不过我觉得更有可能发生的是,中间跳板机做了防火墙限制端口。。so, 用哪种方法其实要看运气。
* 无密码登录和连接方式是两个不同的问题,搜索一下 key-based authentication吧。
假设没有使用公钥验证,用任何方式连接都要输入两次密码。从安全角度看,那还不如尽快启用公钥认证模式。
这一切都可以配置在 .ssh/config 里
Host ec2main
Port 2255
Hostname 23.*.*.*
IdentityFile ~/.ec2/anotheradmin.pem
Host 192.168.*.*
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -NW %h:%p bastion_serv
Host trapped_me
Hostname 192.168.0.1
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -NW %h:%p bastion_serv
Host bastion_serv
Hostname *.*.*.*
Host *
User anotheradmin
ForwardAgent yes
Port 2244
IdentityFile ~/.ssh/id_rsa
UsePrivilegedPort no
ServerAliveInterval 240
ServerAliveCountMax 9999
# --- 这个问题我为毛要写这么详细呢, 因为曾为小公司SA, 真的非常非常想恳求大家别再用expect拉, 特别是千万别放在跳板机啊。