如何用SSH和Cat编写Shell脚本跨Linux服务器合并文件?
跨服务器合并同目录对应文件的Shell脚本实现
完全可以用SSH和Cat编写Shell脚本实现这个需求,前提是你已经在server1上配置好到server2、server3的免密SSH登录(避免脚本执行时手动输入密码)。
实现思路
- 定义需要同步的服务器列表和目标目录
- 遍历server1上
folder1目录下的所有普通文件 - 对每个文件,通过SSH远程读取server2、server3上同路径的文件内容,追加到server1的对应文件中
- 可选:先备份server1的原文件,避免合并出错后无法恢复
示例脚本
#!/bin/bash # 配置参数 LOCAL_DIR="/path/to/folder1" REMOTE_SERVERS=("server2" "server3") REMOTE_DIR="/path/to/folder1" # 备份本地原文件(建议开启,防止合并出错) BACKUP_DIR="${LOCAL_DIR}/backup_$(date +%Y%m%d_%H%M%S)" mkdir -p "${BACKUP_DIR}" cp "${LOCAL_DIR}"/* "${BACKUP_DIR}" # 遍历本地目录下的所有文件 for FILE in "${LOCAL_DIR}"/*; do # 只处理普通文件,跳过目录 if [ -f "${FILE}" ]; then FILENAME=$(basename "${FILE}") echo "正在合并文件: ${FILENAME}" # 遍历远程服务器,追加内容到本地文件 for SERVER in "${REMOTE_SERVERS[@]}"; do # 检查远程服务器是否存在该文件,存在则追加 if ssh "${SERVER}" "[ -f ${REMOTE_DIR}/${FILENAME} ]"; then ssh "${SERVER}" "cat ${REMOTE_DIR}/${FILENAME}" >> "${FILE}" echo " 已从${SERVER}追加内容" else echo " ${SERVER}上不存在${FILENAME},跳过" fi done fi done echo "所有文件合并完成,原文件备份在${BACKUP_DIR}"
使用说明
- 将脚本中的
/path/to/folder1替换为实际的目录路径 - 确保server1能免密登录server2和server3(可通过
ssh-keygen生成密钥,ssh-copy-id server2推送公钥) - 给脚本添加执行权限:
chmod +x merge_files.sh - 在server1上执行脚本:
./merge_files.sh
注意事项
- 如果远程服务器的SSH端口不是默认22,需要在SSH命令中指定端口,例如:
ssh -p 2222 "${SERVER}" "xxx" - 若文件数量多或体积大,可考虑压缩传输后解压追加来优化效率,普通场景下cat+SSH足够用
- 合并前确认远程文件与本地文件编码一致,避免乱码问题
内容的提问来源于stack exchange,提问作者Perichappan Lakshmanan
相关产品推荐
相关产品推荐

