Salve uma lista de arquivos em SFTP em um arquivo de texto

2

Eu forneci minha própria resposta abaixo.

Nós temos um número de scripts bash que funcionam bem usando SFTP, o que eu gostaria de fazer é simplesmente redirecionar um ls ou dir de uma pasta para um arquivo em nosso servidor SFTP.

Podemos executar isso como uma tarefa do cron ou posso executá-lo manualmente. Eu posso visualizar a lista de arquivos do servidor remoto, mas quero gerar a lista de arquivos do servidor remoto para o servidor local em um arquivo de texto ..

Aqui está o que eu tenho para o script bash até agora. O quarto eco listado abaixo é a linha em questão.

#!/bin/bash

localpath=/home/localacct/somepath
remotelocation=/home/account/logs/archive
remotehost=' [email protected]'

    echo  > $localpath/list.sftp
    echo "cd $remotelocation " >> $localpath/list.sftp
    echo "dir *.* " >> $localpath/list.sftp
    echo "dir *.* > $localpath/dirlist.txt " >> $localpath/list.sftp
    echo "bye " >> $localpath/list.sftp
    sftp -b $localpath/list.sftp $remotehost

exit
    
por Leptonator 09.07.2015 / 22:37

5 respostas

0

Existe outra maneira que acabei usando ... Tente usar o rsync.

Encontramos o seguinte:

  • Se você não especificar nenhum destino local, será fornecida uma listagem dos arquivos especificados no servidor remoto.

O script BASH então se torna:

#!/bin/bash
localpath=/home/local-acct/path
remotelocation=/home/account/logs/archive
remotehost=' [email protected]'
rsync -avz $remotehost:/$remotelocation > $localpath/dirlist.txt
exit

e funciona muito bem!

    
por 11.07.2015 / 08:59
5

O comando sftp é muito limitado. Se você não conseguir fazer o que você quer, você pode usar outra abordagem, que é montar o diretório remoto com o SSHFS sistema de arquivos. O SSHFS usa o SFTP como o protocolo de transporte, portanto, o servidor apenas vê um cliente SFTP. Você precisa ser capaz de usar o FUSE no lado do cliente.

Com o SSHFS, você monta o diretório remoto em um diretório vazio existente e usa comandos comuns.

mkdir remote
sshfs "$remotehost:$remotelocation" remote
cd remote

echo *.* >"$localpath/dirlist.txt"

fusermount -u remote
rmdir remote
    
por 10.07.2015 / 02:26
1

O comando dir no cliente sftp não suporta o redirecionamento. Exemplo abaixo, mostrando como isso não faz nada.

sftp> pwd
Remote working directory: /var/tmp/foodir
sftp> lcd /var/tmp/foodir
sftp> dir *.*
foo.txt
sftp> dir *.* >dirlist.txt
foo.txt
sftp> dir
foo.txt
sftp>

A página do manual para sftp confirma.

 ls [-1afhlnrSt] [path]
         Display a remote directory listing of either path or the current directory if path is not specified.  path may contain glob(3) characters and may match mul‐
         tiple files.

         The following flags are recognized and alter the behaviour of ls accordingly:

         -1      Produce single columnar output.

         -a      List files beginning with a dot (‘.’).

         -f      Do not sort the listing.  The default sort order is lexicographical.

         -h      When used with a long format option, use unit suffixes: Byte, Kilobyte, Megabyte, Gigabyte, Terabyte, Petabyte, and Exabyte in order to reduce the
                 number of digits to four or fewer using powers of 2 for sizes (K=1024, M=1048576, etc.).

         -l      Display additional details including permissions and ownership information.

         -n      Produce a long listing with user and group information presented numerically.

         -r      Reverse the sort order of the listing.

         -S      Sort the listing by file size.

         -t      Sort the listing by last modification time.
    
por 09.07.2015 / 23:19
1

no caso de alguém encontrar rsync não funciona (para reports.paypal.com no meu caso) eu encontrei o seguinte script usando expect works:

#!/usr/bin/expect
spawn sftp [email protected]:/ppreports/outgoing
expect "password:"
send "XXXXXXXXXX\n"
expect "sftp>"
log_file -noappend RemoteFileList.txt
send "ls -1\n"
expect "sftp>"
log_file
send "!sed -i '' '/ls -1/d' ./RemoteFileList.txt\n"
expect "sftp>"
send "!sed -i '' '/sftp>/d' ./RemoteFileList.txt\n"
expect "sftp>"
send "bye\n"
interact

Isso está no Mac. Em outros sistemas, as sed linhas podem passar sem os primeiros '' de argumentos.

    
por 09.06.2016 / 08:51
0

Você também pode usar lftp :

lftp -c 'connect sftp://user:password@host/dir; ls' > list.txt

Ou

lftp -e 'ls;quit' sftp://user:password@host/dir > list.txt

lftp também tem um comando find para listagem recursiva.

Passar senhas na linha de comando geralmente é uma má ideia. A alternativa é usar a autenticação da chave ssh, se possível (a senha acima será ignorada se a autenticação da chave estiver disponível, portanto, você a transformará na string vazia). Ou você pode passá-lo pelo ambiente:

 LFTP_PASSWORD=password lftp --env-password -e 'ls;quit' \
   sftp://user:password@host/dir > file.list

Ou passe os comandos via stdin, aqui usando um documento aqui (implementado com tempfiles ou caches deletados dependendo do shell):

lftp <<'EOF' > file.list
connect sftp://user:password@host/dir
ls
EOF
    
por 09.06.2016 / 10:29