Como obter arquivos à medida que são adicionados a um servidor remoto
Pergunta
Estou usando um script bash (abaixo) em um servidor remoto (até agora usando o ssh para conectar) para executar um script python que baixe muitos arquivos PDF um por vez (obtendo os locais de download de um arquivo de texto com o URL) em um loop.
Gostaria de mover os arquivos do servidor remoto para o meu computador local à medida que são baixados e excluir o arquivo do servidor remoto. Existe uma maneira de expandir meu script bash para fazer isso? Ou existem alternativas para concluir esta tarefa?
while read line; do python python_script.py -l $line; done < pdfURLs.txt
Solução
Editado para refletir o fato de que o pôster original não pode SCP em seu computador local a partir do servidor; Presumo que está atrás de Nat ou algo do tipo
Edit 2: estou mantendo a resposta atual baseada em túnel, para referência; Mas, como o pôster original é incapaz de voltar a SSH em sua máquina local, assumirei que outra coisa está bloqueando o túnel. Veja a sugestão no final].
Ok, você precisará abrir um túnel entre o servidor e seu computador doméstico. Então, SSH do seu computador local (presumo que seja baseado em Unix, você mencionou um Mac, então tudo bem) no servidor com este comando:
ssh -R 10022:localhost:22 your_server_address
Em resumo, isso encaminhará a porta 10022 do servidor (é uma porta alta (> 1024), por isso provavelmente estará disponível) para a porta 22 do computador local (que é onde o SSH geralmente ouve). Ou seja, depois que você fez isso, se você ssh na porta 10022 do servidor, estará realmente sshing no computador local. Se você quiser testá -lo, no servidor, faça:
ssh -p 10022 localhost
Faça login com o nome de usuário e a senha do seu computador local e você verá o prompt do shell. Se você fizer esse teste, lembre -se de fazer logon, para não se confundir.
Depois de abrir o túnel, mantenha essa conexão aberta. Você pode usá -lo para executar a linha de comando BASH que baixa o PDF etc, mas isso não é necessário.
Em seguida, tente a seguinte linha de comando:
while read line; do python python_script.py -l "$line"; scp -P 10022 *.pdf localhost:path/to/put/files/; rm *.pdf; done < pdfURLs.txt
Algumas coisas a ter em mente:
- Isso aguarda até que o SCP termine e só então o script Python baixará o próximo PDF. Você mencionou que queria efetivamente isso, não mantendo os arquivos PDF no servidor por muito tempo.
- Isso copia todos os arquivos PDF do diretório atual para o seu computador local (e depois os apaga); portanto, execute isso de preferência a partir de um diretório anteriormente vazio.
- Suponho que você possa SCP sem precisar digitar uma senha (usando a autenticação de chave compartilhada, por exemplo), caso contrário, pode ficar um pouco irritante, tendo que redigir sua senha o tempo todo.
Isso deve resolver.
Editado para adicionar esta alternativa, para quando o túnel não funciona
Se isso falhar, só posso assumir que outra coisa está bloqueando seu SSH/SCP do servidor para a máquina local. Nesse caso, você pode tentar algo diferente: de você local máquina, faça
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"
(A mudança "-n" para SSH é necessária, não para alimentar as linhas subsequentes $ no shell ssh.)