サーバー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
1つの方法は次のとおりです。
#!/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