组合两个 SSH 命令

app*_*ver 2 networking bash ssh ssh-tunneling

第一个 ssh 命令是在我的计算机上完成的,我输入密钥密码,然后在登录服务器时输入第二个 ssh 命令。

ssh -i cloudkey -L 6000:localhost:6001 admin@54.152.188.55 -p 9000
#i get prompted for a password to use the key 
ssh -D 6001 -p 6666 localhost -l dancloud
#i get prompted for a password associated with user dancloud
Run Code Online (Sandbox Code Playgroud)
  1. 如何将这些命令组合成一个命令以获得相同的结果?我发现 netcat 和 ProxyCommand 在这里可能有用,但还没有弄清楚。
  2. 如何对这两个密码进行硬编码并将其放入 bash 脚本中?希望我可以使用./login.sh硬编码到脚本中的密码来运行所有这些代码,并达到相同的最终结果。

Jak*_*uje 5

第一种可能性是显而易见的(注意-t开关):

ssh -t -i cloudkey -L 6000:localhost:6001 admin@54.152.188.55 -p 9000 \
   "ssh -D 6001 -p 6666 localhost -l dancloud"
Run Code Online (Sandbox Code Playgroud)

乍一看ProxyCommand比较复杂,但从概念上讲你只需要一次转发(netcat不再建议版本,使用-Wswitch 更优雅):

Host proxy
  Hostname 54.152.188.55
  User admin
  IdentityFile cloudkey
Host target
  Hostname localhost
  Port 6666
  User dancloud
  DynamicForward 6000
  ProxyCommand ssh -W %h:%p proxy
Run Code Online (Sandbox Code Playgroud)

然后只需使用即可连接ssh target(请参阅...现在您甚至不需要 bash 脚本:))。

说明:第二个ssh也是从您的计算机运行,因此动态转发套接字(SOCKS 代理)是直接在您的计算机上创建的。

关于密码,这不是可取的(密码应该是秘密的),但它可能sshpass在适当的前面工作ssh


手册页将开关ssh解释-W为:

-W host:port

请求通过安全通道将客户端上的标准输入和输出转发到端口上的主机。意味着-N-TExitOnForwardFailureClearAllForwardings。仅适用于协议版本 2。

与 结合使用ProxyCommand,它连接到所请求的内容hostname,然后为您提供netcat(将标准 IO 连接到host:port对(参数)的基本嵌入式版本。