第一个 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
- 如何将这些命令组合成一个命令以获得相同的结果?我发现 netcat 和 ProxyCommand 在这里可能有用,但还没有弄清楚。
- 如何对这两个密码进行硬编码并将其放入 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
不再建议版本,使用-W
switch 更优雅):
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
、-T
、ExitOnForwardFailure
和ClearAllForwardings
。仅适用于协议版本 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"