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

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top