下载05月17日到05月19日的文件
用户有一个目录,里面有很多文件,文件名包含日期,如 20230517
,20230518
,20230519
,如/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 公钥身份验证的步骤:
-
在本地计算机上生成一对公钥和私钥。打开终端并输入以下命令:
ssh-keygen -t rsa
按照提示输入文件名和密码。如果您不想设置密码,请直接按 Enter 键。
-
将公钥复制到远程服务器上的
~/.ssh/authorized_keys
文件中。打开终端并输入以下命令:ssh-copy-id user@server
其中
user
是您在远程服务器上的用户名,server
是远程服务器的 IP 地址或域名。如果您无法使用ssh-copy-id
命令,请手动将公钥复制到远程服务器上的~/.ssh/authorized_keys
文件中。 -
确保远程服务器上的
~/.ssh
目录和authorized_keys
文件的权限正确。打开终端并输入以下命令:chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
这将确保只有您可以访问
~/.ssh
目录和authorized_keys
文件。
请注意,如果您没有在远程服务器上写入文件的权限,则无法将公钥复制到 ~/.ssh/authorized_keys 文件中。在这种情况下,您需要联系服务器管理员,请求他们将公钥添加到 authorized_keys 文件中。