将本地目录中的所有文件移动到远程 SFTP 目录

将本地目录中的所有文件移动到远程 SFTP 目录

我想将本地目录中的所有文件移动到远程目录。

我正在使用此代码来实现它

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

sftpOpenSSH中没有命令移动文件到远程目录。

您可以做的是:

  • 用于sftp put上传文件(正如您已经做的那样),然后

  • 使用shellrm命令删除文件sftp完成后(即之后EOD):

    rm $SOURCE_FILE
    

    或者使用!逃到壳里 来自sftp脚本,在您发送后put

    send "!rm $SOURCE_FILE\r"
    expect "sftp>"        
    

当然,这不是一个原子解决方案。如果在put和之间添加了一个文件rm,它将丢失。对于原子解决方案,您必须迭代本地目录中的文件并逐个上传和删除它们。此外,对于一个健壮的解决方案,您需要检查上传是否成功。

答案2

下面的方法可能会使事情简化很多:

  1. 使用sshfs将远程共享安装为本地路径。
  2. 与所有操作一起工作,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 )

希望对你有帮助

相关内容