编写Bash脚本实现经IP1中转从IP2 SCP文件到本地
实现中转SSH+SCP自动化脚本的方案
我来帮你搞定这个自动化需求,刚好之前处理过类似的跳板机场景。根据你的描述,IP1是免密的中转节点,IP2需要密码且无法直接访问,下面给你两种可行的脚本实现方案:
方法一:用SSH ProxyJump(推荐,适用于OpenSSH 7.3+版本)
如果你的本地机器装的是比较新的OpenSSH版本(7.3及以上),ProxyJump参数可以直接帮你简化中转配置,再配合sshpass自动输入IP2的密码。
步骤1:安装sshpass(处理IP2的密码输入)
先确保本地装了sshpass,它能帮我们自动传递SSH/SCP的密码:
- Debian/Ubuntu系:
sudo apt update && sudo apt install sshpass -y - CentOS/RHEL系:
sudo yum install sshpass -y # 或者用dnf install sshpass
步骤2:编写自动化脚本
创建一个fetch_ip2_logs.sh脚本,内容如下:
#!/bin/bash # 定义变量,根据你的实际情况修改 IP1="192.168.10.10" IP2="192.168.10.9" IP2_PASSWORD="你的IP2密码" # 注意:明文密码有安全风险,后面会提替代方案 LOCAL_DEST="/home/localuser/Desktop/MessageFolder/" # 先创建本地目标目录(如果不存在的话) mkdir -p "$LOCAL_DEST" # 通过IP1中转,从IP2拉取日志到本地 sshpass -p "$IP2_PASSWORD" scp -o ProxyJump=root@$IP1 root@$IP2:/var/log/message* "$LOCAL_DEST"
脚本说明
ProxyJump=root@$IP1:告诉SSH先登录到IP1,再从IP1跳转登录到IP2sshpass -p "$IP2_PASSWORD":自动把IP2的密码传递给SCP,避免手动输入mkdir -p:确保本地目标目录存在,不存在就创建
方法二:用ProxyCommand(兼容旧版SSH)
如果你的SSH版本不支持ProxyJump,可以用ProxyCommand来实现中转,同样配合sshpass:
修改脚本里的SCP命令部分即可:
sshpass -p "$IP2_PASSWORD" scp -o ProxyCommand="ssh root@$IP1 -W %h:%p" root@$IP2:/var/log/message* "$LOCAL_DEST"
这里的ProxyCommand是让本地先通过SSH连接到IP1,然后把IP2的连接请求转发过去。
更安全的替代方案(推荐长期使用)
上面的脚本用明文密码有安全风险,最好的方式是在IP1上配置到IP2的免密登录:
- 登录到IP1:
ssh root@$IP1 - 在IP1上生成SSH密钥对(如果没有的话):
ssh-keygen -t rsa(一路回车默认即可) - 把IP1的公钥复制到IP2:
ssh-copy-id root@$IP2(输入IP2的密码完成配置)
配置完成后,你的脚本就可以去掉sshpass部分,简化成:
#!/bin/bash IP1="192.168.10.10" IP2="192.168.10.9" LOCAL_DEST="/home/localuser/Desktop/MessageFolder/" mkdir -p "$LOCAL_DEST" # 无需密码,直接通过中转拉取 scp -o ProxyJump=root@$IP1 root@$IP2:/var/log/message* "$LOCAL_DEST"
这样既安全又省心,避免了明文密码的风险。
最后别忘了给脚本加执行权限:
chmod +x fetch_ip2_logs.sh
运行脚本就可以自动完成整个流程啦!
内容的提问来源于stack exchange,提问作者JWorkin
相关产品推荐
相关产品推荐

