代码之家  ›  专栏  ›  技术社区  ›  Jordan

如何获取添加到远程服务器的文件

  •  1
  • Jordan  · 技术社区  · 16 年前

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

    我希望在下载文件时将它们从远程服务器移动到本地计算机,然后从远程服务器删除该文件。有没有一种方法可以扩展我的bash脚本来实现这一点?还是有其他方法来完成这项任务?

     while read line; do python python_script.py -l $line; done < pdfURLs.txt
    1 回复  |  直到 16 年前
        1
  •  1
  •   rbp zifot    16 年前

    [编辑以反映原始海报无法从服务器SCP到其本地计算机的事实;我假设它在nat或类似的东西后面]

    [编辑2:我将保留当前基于隧道的答案以供参考;但是,由于原始海报无法通过ssh返回到其本地计算机,因此我假设有其他东西阻塞了隧道。见结尾处的建议。

    好的,您需要打开服务器和家庭计算机之间的通道。所以,本地计算机的ssh(我假设它是基于Unix的,您提到的是一个mac,这样就可以了)通过以下命令进入服务器:

    ssh -R 10022:localhost:22 your_server_address
    

    简而言之,这将把服务器的端口10022(它是一个高(>1024)端口,因此很可能是可用的)转发到本地计算机的端口22(通常是ssh侦听的端口)。也就是说,一旦完成了这项工作,如果您通过ssh连接到服务器的10022端口,那么实际上就是通过ssh连接到本地计算机。如果要从服务器测试它,请执行以下操作:

    ssh -p 10022 localhost
    

    使用本地计算机的用户名和密码登录,您应该看到它的shell提示。如果你做了这个测试,记得注销,以免混淆你自己。

    一旦你打开了隧道,保持连接畅通。您可以使用它来运行bash命令行,该命令行可以下载pdf等文件,但这不是必需的。

    然后,尝试以下命令行:

    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"
    

    (需要切换到ssh的“-n”开关,而不是将后续的$行输入ssh shell。)