从服务器上批量拷贝指定日期的文件

目录

下载05月17日到05月19日的文件

用户有一个目录,里面有很多文件,文件名包含日期,如 202305172023051820230519,如/data/20230517/,/data/20230522/,现在需要将05月17日到19日的这些文件拷贝到本地。

可以通过 find命令来查找指定日期的文件,然后通过 cp命令来拷贝文件到新的目录。前提是用户在服务器上有写权限。

new_root="/home/output"

# 日期列表
dates=("0517" "0518" "0519")

for date in "${dates[@]}"; do
    # 寻找指定日期的文件
    for file in $(find . -name "*$date*" -type f -print); do
        # 在这里对每个文件进行操作,比如打印文件名
        echo $file

        # 提取文件名中的目录部分
        dir=$(dirname "$file")
        echo $dir

        # 提取目录中的最后一个部分作为名称
        name=$(basename "$file")
        echo $name

        # 构建新的目录结构
        new_path=${dir#./}
        echo $new_path

        new_dir="$new_root/$new_path/$name"
        echo $new_dir
        # 如果新目录不存在,则创建它
        mkdir -p "$new_dir"
        # 复制文件到新目录
        cp "$file" "$new_dir"
    done
done

没有写权限

如果用户没有写权限,可以通过 scp命令来拷贝文件到本地。

任务要求:在data文件夹下面,有大概十五个变量命名的文件夹,每个文件夹下面有以日期命名的文件,如/data/height/h5/0517,/data/IMU/0518,…,现在需要把他们按照服务器上的文件路径结构拷贝到本地。

本地是window系统,服务器是linux系统,而且用户在服务器上没有写的权限,意味着没办法上传公钥到服务器上,只能通过密码登录。

思路:

一、通过ssh登录服务器,然后通过find命令查找指定日期的文件, 二、打印结果,并且通过subprocess.getoutput()函数获取结果。 三、通过split()函数将结果分割成一个个文件名。 四、通过os.path.dirname提取文件名中的目录部分,通过os.path.basename提取文件名称。 五、通过os.path.join构建本地的目录结构。 六、通过os.makedirs创建本地目录。 七、通过scp命令将文件拷贝到本地。

这个代码的弊端:每次拷贝都需要输入密码,如果有很多文件需要拷贝,就需要输入很多次密码。

import os
import subprocess

# 本地的根目录
local_root = "D:/"

# 服务器的根目录
remote_root = "/opt/radac/www/data"

# 服务器用户名和服务器地址
user = "radac"
server = "192.168.45.71"
password = "radac"

# 日期列表
dates = ["0520", "0521", "0522"]

for date in dates:
    # 寻找指定日期的文件
    cmd = f'sshpass -p {password} ssh {user}@{server} find {remote_root} -name "*{date}*" -type f -print'
    result = subprocess.getoutput(cmd)
    files = result.split('\n')
    for file in files:
        # 在这里对每个文件进行操作,比如打印文件名
        if "Permission denied" in file:
            continue

        print(file)
      
        # 提取文件名中的目录部分
        dir = os.path.dirname(file)
        # print(dir)

        # 提取目录中的最后一个部分作为名称
        name = os.path.basename(file)
        # print(name)

        # 构建本地的目录结构
        new_path = dir.replace(remote_root, "")
        # print(new_path)

        local_dir = os.path.join(local_root, new_path)
        print(local_dir)

        # 如果本地目录不存在,则创建它
        os.makedirs(local_dir, exist_ok=True)

        # 下载文件到本地目录
        cmd = f'sshpass -p {password} scp {user}@{server}:{file} {local_dir}'
        subprocess.run(cmd, shell=True)

公钥

来源:ChatGPT

要设置 SSH 公钥身份验证,您需要在本地计算机上生成一对公钥和私钥。然后,将公钥复制到远程服务器上的 ~/.ssh/authorized_keys 文件中。

以下是在 Linux上设置 SSH 公钥身份验证的步骤:

  1. 在本地计算机上生成一对公钥和私钥。打开终端并输入以下命令:

    ssh-keygen -t rsa

    按照提示输入文件名和密码。如果您不想设置密码,请直接按 Enter 键。

  2. 将公钥复制到远程服务器上的 ~/.ssh/authorized_keys 文件中。打开终端并输入以下命令:

    ssh-copy-id user@server

    其中 user 是您在远程服务器上的用户名,server 是远程服务器的 IP 地址或域名。如果您无法使用 ssh-copy-id 命令,请手动将公钥复制到远程服务器上的 ~/.ssh/authorized_keys 文件中。

  3. 确保远程服务器上的 ~/.ssh 目录和 authorized_keys 文件的权限正确。打开终端并输入以下命令:

    chmod 700 ~/.ssh

    chmod 600 ~/.ssh/authorized_keys

    这将确保只有您可以访问 ~/.ssh 目录和 authorized_keys 文件。

请注意,如果您没有在远程服务器上写入文件的权限,则无法将公钥复制到 ~/.ssh/authorized_keys 文件中。在这种情况下,您需要联系服务器管理员,请求他们将公钥添加到 authorized_keys 文件中。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦