如何在 Linux 中获取包含感兴趣的特定文件的最新文件夹并在 Python 中使用 Paramiko 下载该文件?
How to get the latest folder that contains a specific file of interest in Linux and download that file using Paramiko in Python?
我正在尝试使用 Python 中的 Paramiko 将特定文件从远程服务器 scp 到我的本地计算机。
背景:
在目标机器 198.18.2.2 上有一个目录 mydir
,其中包含许多以名称 2020...
开头的时间戳目录
目标机器:198.18.2.2
源机器:198.18.1.1
到目前为止,我已经成功构建了要执行的命令,如下所示 -
cd "$(ls -1d /mydir/20* | tail -1)"; scp -o StrictHostKeyChecking=no email_summary.log root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log
代码:
def remote_execute(dest_ip, cmd):
"""API to execute command on remote machine"""
result = []
sys.stderr = open('/dev/null')
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh_client.connect(dest_ip, username='root')
stdin, stdout, stderr = ssh_client.exec_command(cmd)
for line in stdout.readlines():
result.append(line.strip())
ssh_client.close()
return result
except paramiko.AuthenticationException:
print("Authentication with the remote machine failed")
return
except paramiko.SSHException:
print("Connection to remote machine failed")
return
except paramiko.BadHostKeyException:
print("Bad host key exception for remote machine")
return
通话:remote_execute('198.18.1.1', cmd)
问题是 ls -1d /mydir/20* | tail -1
总是给我最新的时间戳文件夹。但是,如果 email_summary.log
文件不在该文件夹中,我想查看下一个包含文件 email_summary.log
的最新时间戳文件夹。
本质上,从包含文件 "email_summary.log" 的最新时间戳文件夹中对文件进行 scp。有人可以帮我解决这个问题吗?
提前致谢。
如何使用 find
查找文件(而不是目录)?
find /mydir/20* -name email_summary.log | sort | tail -1
这将为您提供指向要复制的最新文件的路径。
因此,您的命令将如下所示:
scp -o StrictHostKeyChecking=no "$(find /mydir/20* -name email_summary.log | sort | tail -1)" root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log
在远程计算机上执行 scp
命令以 将文件推回 到本地计算机是一种矫枉过正的做法。通常依赖 shell 命令是非常脆弱的方法。您最好只使用本机 Python 代码,以识别最新的远程文件并将其 拉 到您的本地机器。您的代码将更加健壮和可读。
sftp = ssh.open_sftp()
sftp.chdir('/mydir')
files = sftp.listdir_attr()
dirs = [f for f in files if S_ISDIR(f.st_mode)]
dirs.sort(key = lambda d: d.st_mtime, reverse = True)
filename = 'email_summary.log'
for d in dirs:
print('Checking ' + d.filename)
try:
path = d.filename + '/' + filename
sftp.stat(path)
print('File exists, downloading...')
sftp.get(path, filename)
break
except IOError:
print('File does not exist, will try the next folder')
以上基于:
旁注:不要使用 AutoAddPolicy
。这样做会失去安全感。参见 Paramiko "Unknown Server"。
我正在尝试使用 Python 中的 Paramiko 将特定文件从远程服务器 scp 到我的本地计算机。
背景:
在目标机器 198.18.2.2 上有一个目录 mydir
,其中包含许多以名称 2020...
目标机器:198.18.2.2
源机器:198.18.1.1
到目前为止,我已经成功构建了要执行的命令,如下所示 -
cd "$(ls -1d /mydir/20* | tail -1)"; scp -o StrictHostKeyChecking=no email_summary.log root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log
代码:
def remote_execute(dest_ip, cmd):
"""API to execute command on remote machine"""
result = []
sys.stderr = open('/dev/null')
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh_client.connect(dest_ip, username='root')
stdin, stdout, stderr = ssh_client.exec_command(cmd)
for line in stdout.readlines():
result.append(line.strip())
ssh_client.close()
return result
except paramiko.AuthenticationException:
print("Authentication with the remote machine failed")
return
except paramiko.SSHException:
print("Connection to remote machine failed")
return
except paramiko.BadHostKeyException:
print("Bad host key exception for remote machine")
return
通话:remote_execute('198.18.1.1', cmd)
问题是 ls -1d /mydir/20* | tail -1
总是给我最新的时间戳文件夹。但是,如果 email_summary.log
文件不在该文件夹中,我想查看下一个包含文件 email_summary.log
的最新时间戳文件夹。
本质上,从包含文件 "email_summary.log" 的最新时间戳文件夹中对文件进行 scp。有人可以帮我解决这个问题吗?
提前致谢。
如何使用 find
查找文件(而不是目录)?
find /mydir/20* -name email_summary.log | sort | tail -1
这将为您提供指向要复制的最新文件的路径。
因此,您的命令将如下所示:
scp -o StrictHostKeyChecking=no "$(find /mydir/20* -name email_summary.log | sort | tail -1)" root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log
在远程计算机上执行 scp
命令以 将文件推回 到本地计算机是一种矫枉过正的做法。通常依赖 shell 命令是非常脆弱的方法。您最好只使用本机 Python 代码,以识别最新的远程文件并将其 拉 到您的本地机器。您的代码将更加健壮和可读。
sftp = ssh.open_sftp()
sftp.chdir('/mydir')
files = sftp.listdir_attr()
dirs = [f for f in files if S_ISDIR(f.st_mode)]
dirs.sort(key = lambda d: d.st_mtime, reverse = True)
filename = 'email_summary.log'
for d in dirs:
print('Checking ' + d.filename)
try:
path = d.filename + '/' + filename
sftp.stat(path)
print('File exists, downloading...')
sftp.get(path, filename)
break
except IOError:
print('File does not exist, will try the next folder')
以上基于:
旁注:不要使用 AutoAddPolicy
。这样做会失去安全感。参见 Paramiko "Unknown Server"。