我需要将文件从服务器 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
复制正确的公钥。