linux - 如何将多个 ssh 和 scp 命令脚本化到各种系统

标签 linux bash ssh scp

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

从LOCAL系统,ssh到SYSTEM1
mkdir/tmp/data on SYSTEM1
从 SYSTEM1,ssh 到 SYSTEM2
mkdir/tmp/data on SYSTEM2
从 SYSTEM2,SSH 到 SYSTEM3

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

我每天至少执行一次此过程,在不同系统之间切换大约需要 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 )。我的做法是在本地系统上创建一个包含以下条目的 .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——如果没有,您可能必须找到/安装一些等效的方法来将标准输入和标准输出网关连接到 TCP session 中。)

通过此设置,您可以在 LOCAL 上使用 scp SYSTEM3:/data/data,它会自动通过 SYSTEM1 和 SYSTEM2 建立隧道(并按顺序询问三个 SYSTEMn 的密码-- 这可能有点令人困惑,尤其是当您输入错误时)。

关于linux - 如何将多个 ssh 和 scp 命令脚本化到各种系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592212/

相关文章:

linux - C中使用exit()和wait()从子进程向父进程返回值

linux - 无法在 ec2 实例上安装 ezproxy

linux - bash脚本curl请求中的转义变量

linux - grep -A <num> 直到一个字符串

bash - POSIX SH 使用包含空格的元素构建循环变量

Python 连接到 ssh mysql 服务器

c++ - 与 imread 相比,QImage 到 cv::Mat 转换奇怪的行为

linux - 流水线化 stderr 时如何使行缓冲工作?

git - 是否有使 Robohelp 2019 与 Windows 10 ssh-agent 一起使用的解决方法?

perl - 如何让我的 perl 脚本将服务器的 key 添加到 SSH 列表中?