【问题标题】:how to get files as they are added to a remote server如何在将文件添加到远程服务器时获取文件
【发布时间】:2011-03-05 01:01:46
【问题描述】:

我在远程服务器(到目前为止使用 ssh 连接)上使用 bash 脚本(如下)来执行一个 python 脚本,该脚本一次下载大量 pdf 文件(从文本文件中获取下载位置URL) 在一个循环中。

我想在下载文件时将文件从远程服务器移动到我的本地计算机,然后从远程服务器中删除文件。有没有办法可以扩展我的 bash 脚本来做到这一点?或者有其他方法可以完成这项任务吗?

 while read line; do python python_script.py -l $line; done < pdfURLs.txt

【问题讨论】:

  • 我刚刚意识到:远程服务器是否可以直接访问您的本地计算机(即,您可以从服务器 scp 到本地计算机)吗?
  • 我还没有尝试过这样的事情,但我希望我不必打开多个连接,并且我可以通过一个 scp 或 ssh 连接(或任何适合我需要的东西)来完成)。

标签: python bash ssh scp


【解决方案1】:

[编辑以反映原始发布者无法从服务器 scp 到他的本地计算机的事实;我认为它在 NAT 或类似的东西之后]

[编辑 2:我保留当前基于隧道的答案,以供参考;但是,由于原始发布者无法 ssh 回到他的本地机器,我会假设其他东西阻塞了隧道。见最后的建议]。

好的,您需要在服务器和家用计算机之间打开一条隧道。因此,使用以下命令从您的本地计算机(我假设它是基于 Unix 的,您提到的是 Mac,所以没关系)通过 ssh 进入服务器:

ssh -R 10022:localhost:22 your_server_address

简而言之,这会将服务器的端口 10022(它是一个高 (> 1024) 端口,因此它很可能可用)到您本地计算机的端口 22(这是 ssh 通常监听的地方)。也就是说,一旦你这样做了,如果你 ssh 到服务器的 10022 端口,你实际上是在 ssh 到你的本地计算机。如果你想测试它,从服务器,做:

ssh -p 10022 localhost

使用本地计算机的用户名和密码登录,您应该会看到它的 shell 提示符。如果您进行此测试,请记住退出,以免混淆。

打开隧道后,请保持该连接打开。您可以使用它来运行下载 PDF 等的 bash 命令行,但这不是必需的。

然后,尝试以下命令行:

while read line; do python python_script.py -l "$line"; scp -P 10022 *.pdf localhost:path/to/put/files/; rm *.pdf; done < pdfURLs.txt

需要注意的几点:

  • 这会等到 scp 完成,然后 python 脚本才会下载下一个 PDF。您提到您实际上想要这样做,而不是将 PDF 文件长期保存在服务器上。
  • 这会将所有 PDF 文件从当前目录复制到您的本地计算机(然后删除它们),因此最好从以前的空目录运行它。
  • 我假设您无需输入密码即可 scp(例如,使用共享密钥身份验证),否则可能会有点烦人,不得不一直重新输入密码。

应该可以的。

[编辑添加此替代方案,用于隧道不工作时]

如果失败,我只能假设有其他东西阻止了您的 ssh/scp 从服务器到本地计算机。在这种情况下,您可以尝试不同的方法:从您的 本地 机器上,做

while read line; do ssh -n server_address "cd tmp_download_directory && rm -f *.pdf && python python_script.py -l $line" && scp server_address:tmp_download_directory/*.pdf /local/path/to/put/files/; done < pdfURLs.txt; ssh server_address "rm -f tmp_download_directory/*.pdf"

(“-n”切换到 ssh 是必要的,不要将后续的 $lines 输入 ssh shell。)

【讨论】:

  • 让我详细说明一下,python 脚本正在下载它去 URL 下载页面上的 pdf,然后使用一些元数据为它分配一个新文件名,因此 $ 的值行将是 baseURL.com/content/hashcode,然后在远程服务器上将文件保存为 pdf_content_title.pdf(与传递给 $line 的值不同)。我想我可以修改 python 脚本以将文件名分配给 URL。
  • @rdp: subshel​​l 可能不是必需的。
  • @Dennis:如果没有子shell,& 将无法工作(如果代码是在shell 中编写的,而不是在单独的文件中)。而且,如果没有 &,Python 脚本在 scp 完成之前不会开始下载下一个文件。
  • @rbp 当您说“...直到 scp 完成”时,您的意思是在文件完全传输之前,python 脚本不会再次运行?因为出于我的目的,这可能是一件好事,我需要将文件传输到我的计算机的原因是因为我在服务器上没有足够的空间来存储所有 pdf 文件
  • @Jordan:是的,我就是这个意思。好的,这只是意味着从命令中删除括号和&符号。但这仍然引出了一个问题,即您是否可以从服务器 scp 到您的家用计算机(但是,您的家用计算机是否也运行 Linux/Unix?)
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
相关资源
最近更新 更多