我在远程服务器上使用bash脚本(下面)(到目前为止使用ssh连接)来执行一个python脚本,一次下载一个pdf文件(从一个文本文件中获取下载位置) ()循环中的URL。
我想在下载文件时将文件从远程服务器移动到本地计算机,然后从远程服务器删除该文件。有没有办法可以扩展我的bash脚本来执行此操作?或者有完成此任务的替代方案吗?
while read line; do python python_script.py -l $line; done < pdfURLs.txt
答案 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
要记住的一些事项:
应该这样做。
[编辑添加此替代方案,因为当隧道不起作用时]
如果失败,我只能假设其他东西阻止你的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。)