组合两个 SSH 命令

组合两个 SSH 命令

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

ssh -i cloudkey -L 6000:localhost:6001 [email protected] -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
  1. 如何将这些命令组合成一个命令以获得相同的结果?我发现 netcat 和 ProxyCommand 在这里可能有用,但还没有弄清楚。
  2. 如何对这两个密码进行硬编码并将其放入 bash 脚本中?希望我可以使用./login.sh硬编码到脚本中的密码来运行所有这些代码,并达到相同的最终结果。

答案1

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

ssh -t -i cloudkey -L 6000:localhost:6001 [email protected] -p 9000 \
   "ssh -D 6001 -p 6666 localhost -l dancloud"

乍一看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

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

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

关于密码,不建议这样做(密码应该是秘密), 但它可能工作用sshpass在前面比较合适ssh


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

-W host:port

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

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

答案2

您应该能够通过类似以下内容来完成您想要做的事情:

ssh -i cloudkey -L 6000:localhost:6001 [email protected] -p 9000 -t "ssh -D 6001 -p 6666 localhost -l dancloud"

-t标志在第一台机器上强制使用伪 tty,并在第一台机器上执行其余代码;在本例中,ssh 到 dancloud 隧道。双引号可以是可选的,对于以下命令:

ssh 10.0.0.0 -t ssh 192.168.0.0

不需要引号,我每天都使用这个命令(显然使用正确的 IP)。但如果没有引号而失败,您的里程可能会有所不同,只需添加它们;-)

至于脚本中的硬编码密码,我能想到的实现这一点的唯一方法是使用预计脚本,但这需要一些 TCL 代码知识。最好在所有适用的计算机上使用 ssh 转发和基于密钥的身份验证。您可以查看一个名为的简单程序钥匙链只需在$HOME/.bashrc文件中添加以下内容即可: keychain --agents ssh 钥匙串将找到您的 ssh 密钥并根据需要创建您的 ssh 代理,或者使用现有的代理,如果您ssh在多个终端中使用,这会很有帮助。

值得注意的是,使用基于密钥的身份验证,您只需添加-A到您的 ssh 参数:

ssh -A -i cloudkey -L 6000:localhost:6001 [email protected] -p 9000 -t "ssh -D 6001 -p 6666 localhost -l dancloud"

相关内容