我想编写一系列涉及多个ssh和scp调用的命令。我每天都发现自己手动执行此任务:

从本地系统,SSH到SYSTEM1
SYSTEM1上的mkdir / tmp / data
从SYSTEM1,ssh到SYSTEM2
SYSTEM2上的mkdir / tmp / data
从SYSTEM2,SSH到SYSTEM3

从SYSTEM3:/数据的SCP文件到SYSTEM2:/ tmp /数据
退出到SYSTEM2
从SYSTEM2:/ data和SYSTEM2:/ tmp / data到SYSTEM1:/ tmp / data的scp文件
rm -fr SYSTEM2:/ tmp /数据
退出到SYSTEM1
从SYSTEM1:/ data和SYSTEM1:/ tmp / data到本地:/ data的scp文件
rm -fr SYSTEM1:/ tmp / data

我每天至少进行一次此过程,并且在不同系统之间花费大约5-10分钟的时间,然后进行清理。我真的很想在bash脚本中自动执行此操作,但到目前为止,我的业余尝试都没有成功。您可能会怀疑,系统通信受到限制,这意味着LOCAL仅能看到System1,System2只能看到System1和System3,system3只能看到system2,依此类推。做这个的最好方式是什么?此外,System1是许多其他系统的集线器,因此用户必须指明SYSTEM2(与任何SYSTEM2相比,System3始终具有相同的相对IP /主机名)。

我尝试只是按照正确的顺序将命令放入shell脚本中,然后在出现提示时手动输入密码(这已经大大提高了效率),但是该方法无效或脚本的执行错误。另外,我想为脚本提供一个命令行参数,该参数将采用连接“system2”的模式,要复制的数据的模式以及本地系统上数据的目标位置。


./grab_data system2 *05-14* ~/grabbed-data

我做了一些搜索,我想下一步是在每个系统上都有执行本地任务的脚本,然后通过来自各自远程系统的ssh命令执行这些脚本。有没有更好的办法?我应该查看使用哪些命令,以及将这种嵌套的ssh和scp问题自动化的一般方法是什么?

我意识到自己的描述可能有些混乱,因此请在我没有正确描述的任何方面进行澄清。

谢谢。

最佳答案

通过在其他ssh连接上建立ssh连接的隧道,可以大大简化此过程(请参阅this previous answer)。我要做的方法是在LOCAL系统上使用以下条目创建一个.ssh / config文件:

Host SYSTEM3
        ProxyCommand    ssh -e none SYSTEM2 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM3.full.domain
        User            system3user

Host SYSTEM2
        ProxyCommand    ssh -e none SYSTEM1 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM2.full.domain
        User            system2user

Host SYSTEM1
        HostName        SYSTEM1.full.domain
        User            system1user

(假设两个中间主机都将netcat安装为/ usr / bin / nc -如果未安装,则可能必须找到/安装将stdin&stdout网关连接到TCP session 的某种等效方法。)

通过此设置,您可以在LOCAL上使用scp SYSTEM3:/data /data,它将自动通过SYSTEM1和SYSTEM2进行隧道传输(并依次要求输入三个SYSTEMn的密码-这可能会有些混乱,特别是如果您键入错误的密码)。

10-08 06:42