将文件从服务器 A 复制到服务器 B

将文件从服务器 A 复制到服务器 B

我需要将文件从服务器 A 复制到服务器 B 然后将复制的文件从服务器 A 移动到存档文件夹

我已经编写了脚本,但它采用的目录名称不同。将文件从服务器 A 复制到服务器 B 正常,但将文件移动到存档文件夹失败

脚本

#!/usr/bin/env bash

username="tempusr"
dir_origin="/data"
dir_destination="/export/home/tempusr/data"
Ip="123.456.789"

echo $dir_origin

echo "Uploading files to remote server...."
dt=$(date +%Y%m%d%H%M%S)
for file in /data/*.xml
do
    name=${file%.*}
    echo "Name is: "${name}
    echo "File is: "/data/$file
    echo "Coping files from Server A to Server B"
    scp -rC $file $username@$Ip:$dir_destination
    echo "New File is: " /data/processed/${name}_${dt}.xml
    echo "Moving files from Server A /data to /data/processed and appending timestamp before file type"
    mv $file /data/processed/${name}_${dt}.xml
done
echo "File upload to remote server completed! ;)"

我得到的输出是:问题:如果您检查行文件是:其路径为“/data//data/”,但它需要路径为/data/。我不明白我错在哪里。

./transfer.sh
/data
Uploading files to remote server....
Name is: /data/1552653_123510007_1316325
File is: /data//data/1552653_123510007_1316325.xml
SERVERB password:
1552653_123510007_1316325.xml 100% 2204 1.6MB/s 00:00
New File is: /data/processed//data/1552653_123510007_1316325_20230914002942.xml
mv: cannot move '/data/1552653_123510007_1316325.xml' to '/data/processed//data/1552653_123510007_1316325_20230914002942.xml': No such file or directory.

此外,它每次都要求输入密码并在此系统上sshpass运行apt install sshpass。那么有没有其他方法,我可以直接在scp命令中传递密码,或者这样我就不需要每次都输入密码。

答案1

替换行:

    mv $file /data/processed/${name}_${dt}.xml

    mv "$file" /data/processed/"${name##*/}_${dt}.xml"

##*/删除变量名称的路径(直到(包括)最后一个斜杠的所有内容)。双引号变量将确保包含空格或其他 shell 敏感字符的文件名仍能正确处理。

对于您的其他问题,如评论中所述,请为您的私钥设置不带密码的 ssh 公钥身份验证。

答案2

这个问题可以在你的第一行输出中清楚地看到,

Name is: /data/1552653_123510007_1316325

无论您在哪里使用,$name都将包含/data/前缀。

因此,要解决此问题,请从路径中删除前缀$name或停止重新包含/data在路径中。这是一种方法:

#!/bin/sh
username="tempusr"
origin="/data"
backup="/data/processed"
destination="/export/home/tempusr/data"
ip="203.0.113.1"

dt=$(date +%Y%m%d%H%M%S)

echo "Uploading files to remote server..."
for file in "$origin"/*.xml
do
    [ -f "$file" ] || continue    # In case there are no files to copy

    name=${file%.*}               # Strip extension
    name=${name##*/}              # Strip leading path
    save="${name}_$dt.xml"        # Backup filename with datetime suffix

    echo "Name is: $name"
    echo "File is: $file"

    echo "Copying file from Server A to Server B"
    scp -C -- "$file" "$username@$ip:$destination"

    echo "New file is: $backup/$save"
    echo "Moving file from Server A $origin to $backup and appending timestamp before file type"
    mv -f -- "$file" "$backup/$save"
done
echo 'File upload to remote server completed! ;)'

您可以使用ssh公钥证书来避免每次都输入密码。这是有详细记录的,但其要点如下:

ssh-keygen -t ed25519      # Take defaults, do not overwrite an existing key
ssh-copy-id username@ip    # Replace username@ip to match your script values

如果ed25519无法识别,您可以尝试rsa替代,但请确保ssh-copy-id复制正确的公钥。

相关内容