如何在将文件添加到远程服务器时获取文件

时间:2010-06-17 15:40:26

标签: python bash ssh scp

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

我想在下载文件时将文件从远程服务器移动到本地计算机,然后从远程服务器删除该文件。有没有办法可以扩展我的bash脚本来执行此操作?或者有完成此任务的替代方案吗?

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

1 个答案:

答案 0 :(得分:1)

[编辑反映原始海报不能从服务器进入本地计算机的事实;我认为它落后于NAT或类似的东西]

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

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

ssh -R 10022:localhost:22 your_server_address

简而言之,这将转发服务器的端口10022(它是一个高(> 1024)端口,因此它可能可用)到本地计算机的端口22(这是ssh通常监听的位置)。也就是说,一旦你完成了这个,如果你进入服务器的10022端口,你实际上是在闯入你的本地计算机。如果要测试它,请从服务器执行:

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是必要的,不要将子序列$行提供给ssh shell。)