我想将本地目录中的所有文件移动到远程目录。
我正在使用此代码来实现它
SOURCE_FILE=/var/www/oneserver/*
TARGET_DIR=/var/www/anotherServer
ARCHIEVEFILE=/var/www/archieveServer
/usr/bin/expect<<EOD
spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
EOD
它运行良好,但有时它会停止并且只发送一些文件。
我也想ARCHIEVEFILE
使用mv
命令移动已发送的文件。但不知道如何移动它。我无法使用 SCP,因为远程服务器不允许使用基本端口,唯一的方法是使用 SFTP。
仍然是
$ARCHIEVEFILE
本地服务器,只是为了备份/移动,这样这些文件就不会再通过下一个 cronjob 发送这
TARGET_DIR
是远程服务器。
有人可以帮忙吗?
答案1
答案2
下面的方法可能会使事情简化很多:
- 使用
sshfs
将远程共享安装为本地路径。 - 与所有操作一起工作,
cp
并且/或者mv
好像所有操作都是本地的。
比较我的这个答案。
您仍然需要一些逻辑来检测是否cp
成功到达远程位置,然后才mv
到达本地存档;否则重试或采取其他措施。但现在所有与 SFTP 相关的工作都应该由 透明地处理sshfs
。
此外,您使用的 shell 通配符和引号会使您的代码容易出现与文件名中的空格等相关的错误。
例如,在您安装远程共享后/mnt/a b/remote
,处理起来将变得容易得多。
(笔记:使用小写变量名是一种很好的做法)。
安装:
sshfs -p $port $user@$host:"/path/on/the/remote/host/" "/mnt/a b/remote/"
使用基于密钥的身份验证或读取sshfs 命令行中的用户名和密码。 阅读安全问题。
复制文件的代码存根:
# I deliberately use paths with spaces to show how to handle them for filename in "/source/location with spaces"/*; do cp "$filename" "/mnt/a b/remote/" && mv "$filename" "/archive/location with spaces/" done
这
&&
确保mv
只有成功时才会运行cp
。卸载:
fusermount -u "/mnt/a b/remote/"
答案3
你可以压缩你想要传输的源目录
zip -r -9 /path/to/your/zip_file.zip var/www/oneserver/*
(-r 将递归到子目录,-9 将应用最大压缩以实现更快的传输)
然后将文件 scp 到远程服务器
scp /path/to/your/zip_file.zip user@host:/var/www/anotherServer
然后在远程服务器上解压该文件
ssh user@host 'unzip /var/www/anotherServer/zip_file.zip'
(您可以使用许多与 unzip 一起使用的标志来覆盖或永不覆盖远程服务器上的现有文件,请检查 man unzip 以了解它们,尤其是 -n -o 和 -u )
希望对你有帮助