서버 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"

##*/변수 이름의 경로(마지막 슬래시까지 포함) 가 제거 됩니다 . 변수를 큰따옴표로 묶으면 공백이나 기타 쉘 구분 문자가 포함된 파일 이름이 계속 올바르게 처리됩니다.

다른 질문에 대해서는 댓글에서 언급한 대로 개인 키에 대한 비밀번호 없이 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시도해 볼 수 있지만 올바른 공개 키를 복사했는지 확인하세요.rsassh-copy-id

관련 정보