我正在尝试编写一个 bash 脚本,首先从我的本地主机 ssh 进入 IP1(要求输入密码),然后 ssh 进入 IP2。进入 IP2 后,我想 scp 到我的本地机器。
IP1=192.168.10.10
IP2=192.168.10.9
ssh root@$IP1
ssh root@$IP2
cd /var/log
scp message* localuser@$localIP:/home/localuser/Desktop/MessageFolder/
以上是我目前必须通过 Linux 中的命令行手动执行的操作。我基本上是从 192.168.10.9 复制到我的本地计算机
我无法直接访问 IP2。可以将其视为后门。IP2 有密码,而 IP1 没有。
有什么办法吗?如果这没有帮助,我写了更多的代码。
有人可以验证我是否可以做与此解决方案类似的事情:是否可以使用本地机器上的一个命令通过代理进行 scp ?
我也听说过端口转发...在这个例子中它如何工作?
我对 Bash 脚本还很陌生,希望大家能有耐心。
答案1
SSH 对此提供了支持。我将引用以下答案:这里:
根据 ssh 手册页,ProxyCommand 是正确的方法
语法为:
ProxyCommand ssh -W %h:%p user@jumphost 2> /dev/null
或者,在足够新的系统上:
从 OpenSSH 7.3(2016 年末)开始,最简单的方法是代理跳转设置。在您的
~/.ssh/config
:Host B ProxyJump A
或者在命令行上,,
-J B
。
后一种解决方案甚至支持任意深度的链,请参阅链接指南。
使用 SCP,您不能使用-J
,所以它看起来像这样:
scp -o "ProxyJump root@$IP1" root@$IP2:/var/log/message* /home/localuser/Desktop/MessageFolder/
答案2
您不能在一台机器上启动脚本,然后通过 ssh 进入另一台机器并让脚本在那里继续运行。
但是您可以在远程机器上执行一系列命令,如下所示:
ssh -t root@IP1 'ssh root@IP2 scp /var/log/message* <user>@<IP>:/home/localuser/Desktop/MessageFolder/; ls /var/log/message*'
这就是说ssh
进入 IP1,并将该行的剩余部分作为登录后运行的命令。
引号中是运行的命令,即 ssh 进入第二个 IP,以及登录后运行的命令。
答案3
让我先说清楚一点:
- localIP 需要 /home/localuser/Desktop/MessageFolder/ 中的文件
- 所需文件位于 IP2 上的 /var/log/message*
- 访问 IP2 的唯一方法是从 IP1
您需要研究如何使用密钥代替密码来使用 ssh/scp,如https://wiki.archlinux.org/index.php/SSH_keys。我还建议不要使用 root 用户执行此基本操作。
假设这些假设是正确的,您可以使用 SSH 的隧道功能,这样本地 IP 机器就可以通过 ssh/scp 进入 127.0.0.1:SomeUnusedPort 以到达 IP2。主要棘手的部分是知道何时断开本地 IP 机器与 IP1 机器的连接。
这是一段快速代码块,用于执行我的想法。请注意,我根本没有测试过它。
IP1=192.168.10.10
IP2=192.168.10.9
SomeUnusedPortOnLocalIP=2209
ssh -L $SomeUnusedPortOnLocalIP $IP2:22 root@$IP1 "while [ ! -f /tmp/disconLocalIP.now ]; do sleep 2; done; rm /tmp/disconLocalIP.now " &
# connects to IP1 establishing an ssh tunnel between localIP and IP2
# the loop testing for the existence of a file to let it know when to disconnect
# the & symbol lets the command run in the background and the script to continue with it still running
# wait for the connection to actually establish fully before proceeding.
sleep 10
# connect to port tunnel on localIP to get files from IP2
scp -P $SomeUnusedPortOnLocalIP root@$127.0.0.1:/var/log/message* /home/localuser/Desktop/MessageFolder/
scp -P $SomeUnusedPortOnLocalIP root@$127.0.0.1:/var/log/log* /home/localuser/Desktop/OtherLogs/
# put file on IP1 to tell loop to end and exit previous ssh session
ssh root@$IP1 "touch /tmp/disconLocalIP.now"