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

标签 python bash ssh scp

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

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

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

最佳答案

[编辑以反射(reflect)原始发布者无法从服务器 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(例如,使用共享 key 身份验证),否则可能会有点烦人,必须始终重新输入密码。

应该可以了。

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

如果失败,我只能假设有其他东西阻止了您的 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。)

关于python - 如何在文件添加到远程服务器时获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3063235/

相关文章:

python - 停止 Tkinter 菜单自动运行命令

python - 使用python将文本文件(对象)作为.txt插入到excel表的单元格中

ruby-on-rails - Ruby selenium webdriver 无法找到 Mozilla geckodriver

linux - 是否可以覆盖您正在处理的文件?

ubuntu - 无法 ssh localhost:权限被拒绝(公钥)/连接被::1 [preauth] 关闭

authentication - 修改用于公钥签名的 SSH 代理

python - 正则表达式替换使用函数python

python - 从 Weedmaps 中抓取菜单数据

linux - 如何使用 <ctrl>c 从 script-1.sh 杀死 script-0.sh?

ssh - 有没有一种简单的方法可以使用它们的名称标签连接到 EC2 实例?