我需要编写一个脚本通过 ssh 从家里远程连接到我的大学服务器,然后从服务器终端 ssh 连接到虚拟机来处理一些数据。这可能吗?
这是我到目前为止所尝试过的:
#!/usr/bin/expect
set login "myuser"
set addr "test.ac.uk"
set addr2 "t002"
set pw "mypassword"
spawn ssh -o StrictHostKeyChecking=no $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
spawn ssh -o StrictHostKeyChecking=no $login@$addr2 -p 22
expect "$login@$addr2\'s password:"
send "$pw\r"
expect "#"
send "cd /developer\r"
interact
错误: ssh: 连接到主机 t002 端口 22: 连接被拒绝
这是我目前从家里成功手动登录的方式:
~/Desktop # ssh host
提示输入密码。
一旦登录成功。
-bash-4.2$ ssh user@t002
提示再次输入密码。
编辑:我按照迈克的建议更新了第二条 ssh 线。
从:
spawn ssh -o StrictHostKeyChecking=no $login@$addr2 -p 22
到:
send "ssh -o StrictHostKeyChecking=no $login@$addr2 -p 22\r"
现在脚本返回拒绝访问,但同时它确实将我登录到服务器而不是虚拟机。
答案1
这是一个常见的问题,您想要访问无法从外部互联网直接访问的服务器,但它是可从公开的中间主机访问。 (中间宿主称为跳箱.)
由于这个问题如此普遍,OpenSSH 自然会提供方便的方法来简化 Jumpboxes(或 Jumpboxen?)的使用。有两种方法,一种是旧方法,另一种是新方法。旧方法仍然有效,但新方法更直观,并且对跳转盒上可用的应用程序做出的假设更少。
使用问题中提到的示例机器,可以像这样完成:
ssh -o StrictHostKeyChecking=no -o [email protected] myuser@t002
或者,我认为不是等价的。-o [email protected]
-W [email protected]
无论哪种方式,该方法都需要足够新的 OpenSSH 版本。如果您遇到旧版本的问题,您需要执行以下操作:
ssh -o StrictHostKeyChecking=no -o ProxyCommand='ssh [email protected] "nc %h %p"' myuser@t002
旧方法假设您已在 Jumpbox 上安装了 netcat。
新方法的另一个好处是您不需要在 Jumpbox 上保留私钥。 ProxyJump 足够聪明,可以尝试使用您本地拥有的私钥。因此,如果跳转盒受到损害,它不需要能够损害跳转盒后面的任何内容。
现在,您可能厌倦了每次都写出那么长的命令。您使用 ssh 的次数越多,您就越有动力建立$HOME/.ssh/config
.在该文件中,您可以为远程主机提供别名,并将特定配置与这些主机相关联。
对于您的示例,ssh_config 将像这样设置:
Host jumpbox
User myuser
Hostname test.ac.uk
StrictHostKeyChecking=no
Host t002
User myuser
StrictHostKeyChecking=no
ProxyJump jumpbox
完成该配置后,您现在应该能够使用更简单的命令登录 t002:
ssh t002
使用 ssh_config 还可以做很多其他很酷的事情。man ssh_config
当您了解有关 ssh 的更多信息时,请时不时地查看并重新访问它。你会不断发现更酷的事情可以做:)
设置 ssh 配置的介绍性演练示例是https://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/
答案2
你生成一个新的 ssh。尝试:
send "ssh -o StrictHostKeyChecking=no $login@$addr2 -p 22\r"
答案3
我只需在脚本中使用命令来减少输入,然后输入用户信用!
#!/bin/bash
ssh -o StrictHostKeyChecking=no [email protected] 'ssh -o StrictHostKeyChecking=no myuser@t002'
根据您的需求量身定制..
ssh -o StrictHostKeyChecking=no [email protected] 'ssh -tt -o StrictHostKeyChecking=no myuser@t002'
将密钥从第一台服务器复制到您的电脑并像这样引用它:
ssh -o StrictHostKeyChecking=no [email protected] 'ssh -tt -o StrictHostKeyChecking=no -i /ssh/1stserverkey myuser@t002'