Guardar una lista de archivos a través de SFTP en un archivo de texto

3

He proporcionado mi propia respuesta a continuación.

Tenemos varios scripts de bash que funcionan bien con SFTP, lo que me gustaría hacer es simplemente redirigir un ls o dir de una carpeta a un archivo en nuestro servidor SFTP.

Podemos ejecutar esto como un trabajo cron o puedo ejecutarlo manualmente. Puedo ver la lista de archivos desde el servidor remoto, pero quiero generar la lista de archivos desde el servidor remoto al servidor local en un archivo de texto. .

Esto es lo que tengo para el script bash hasta ahora. El cuarto eco que se enumera a continuación es la línea en cuestión.

#!/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
Leptonador
fuente
Entonces, ¿qué es lo que este script no está haciendo bien?
111 ---
No está escribiendo la lista (ls) de archivos en el archivo de texto. Hay algo mal con lo siguiente: echo "dir . > $ Localpath / dirlist.txt"
Leptonator
Simplemente curioso y probablemente afirmando lo obvio: debes usar SFTP, ¿verdad? ¿Esto no funcionará para su caso de uso? ssh $remotehost ls > $localpath/list.sftp
berto
debe escribir su respuesta como respuesta separada y aprobarla.
Archemar
Recupere mi respuesta publicada anteriormente y ahora es visible. Gracias por la orientación
Leptonator

Respuestas:

5

El sftpcomando es muy limitado. Si no puede hacer que haga lo que quiere, puede usar otro enfoque, que es montar el directorio remoto con el sistema de archivos SSHFS . SSHFS utiliza SFTP como protocolo de transporte, por lo que el lado del servidor solo ve un cliente SFTP. Debe poder usar FUSE en el lado del cliente.

Con SSHFS, monta el directorio remoto en un directorio vacío existente y usa comandos comunes.

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

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

fusermount -u remote
rmdir remote
Gilles
fuente
2

Esto funciona de lejos el mejor:

echo 'ls' | sftp hostname

Puede reenviar la salida a un archivo mediante

echo 'ls' | sftp hostname > /tmp/mylist.txt
Ještě Poslední
fuente
Devolver un archivo por fila debería hacer que la salida sea más fácil de manejar:echo 'ls -1a' | sftp hostname
dnlbrky
1

en caso de que alguien encuentre rsyncque no funciona (para reports.paypal.com en mi caso) encontré el siguiente script usando expecttrabajos:

#!/usr/bin/expect
spawn sftp username@reports.paypal.com:/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

Esto está en Mac. En otros sistemas, las sedlíneas podrían prescindir de los primeros ''argumentos.

ajlowndes
fuente
1

El dircomando dentro del sftpcliente no admite la redirección. Ejemplo a continuación, que muestra cómo no hace 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>

Página desftp manual para confirma.

ls[ -1afhlnrSt] [ path]

    Mostrar una lista de directorio remoto de cualquiera patho el directorio actual si pathno se especifica.  pathpuede contener caracteres glob (3) y puede coincidir con varios archivos.

    Los siguientes indicadores son reconocidos y alteran el comportamiento de lsacuerdo con esto:

    -1

        Produce una salida columnar única.
    -a
        Lista de archivos que comienzan con un punto (' .').
    -f
        No ordenar el listado. El orden de clasificación predeterminado es lexicográfico.
    -h
        Cuando se usa con una opción de formato largo, use sufijos de unidad: Byte, Kilobyte, Megabyte, Gigabyte, Terabyte, Petabyte y Exabyte para reducir el número de dígitos a cuatro o menos usando potencias de 2 para tamaños (K = 1024, M = 1048576, etc.).
    -l
        Mostrar detalles adicionales, incluidos los permisos y la información de propiedad.
    -n
        Produzca una lista larga con información de usuarios y grupos presentada numéricamente.
    -r
        Invierta el orden de clasificación de la lista.
    -S
        Ordenar la lista por tamaño de archivo.
    -t
        Ordenar el listado por última hora de modificación.

Steve
fuente
0

Hay otra forma que terminé usando ... Intente usar rsync.

Encontramos lo siguiente:

  • Si no especifica un destino local, se proporciona una lista de los archivos especificados en el servidor remoto.

El script BASH se convierte en:

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

y funciona muy bien!

Leptonador
fuente
2
Tenga en cuenta que rsyncutiliza ssh(por lo tanto, supone que el usuario remoto tiene acceso de shell), no sftp(un subsistema de ssh que no requiere que el usuario tenga acceso de shell) y supone que rsyncestá instalado en la máquina remota. Así que bien podría hacerlossh user@host ls /dir > file
Stéphane Chazelas
0

También puedes usar lftp:

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

O

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

lftptambién tiene un findcomando para el listado recursivo.

Pasar contraseñas en la línea de comando es generalmente una mala idea. La alternativa es usar la autenticación de clave ssh si es posible (la contraseña anterior se ignorará si la autenticación de clave está disponible, por lo que se convierte en la cadena vacía). O puede pasarlo por el medio ambiente:

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

O pase los comandos a través de stdin, aquí usando un documento here (implementado con archivos temporales eliminados o tuberías según el shell):

lftp <<'EOF' > file.list
connect sftp://user:password@host/dir
ls
EOF
Stéphane Chazelas
fuente
0

Entonces también puedes usar este método (con un ejemplo diferente):

#!/bin/bash +x

fct()
{
        a=`sftp user@host<< EOL
        ls -la ..
EOL`
        echo $a
        echo $a > tsftpres.000
}

fct
fct > tsftpres.001

fct_2()
{
        sftp user@host << EOL
        ls -la ..
EOL
}

fct_2 > tsftpres.002
Noxxod
fuente
(1) Supongo que estás tratando de mostrar variaciones sobre un tema, pero esto es un poco incoherente. Demuestra la creación de tres archivos (uno de ellos se escribe dos veces). ¿Son idénticos? ¿Hay alguna razón por la que un usuario prefiera uno de estos comandos sobre los demás? (2) ¿Por qué estás enumerando en ..lugar de remotelocation? (3) ¿Has probado esto? ¿Realmente produce resultados razonables? Pregunto porque espero que echo "$a"funcione mucho mejor que echo $a. (4) ¿El nombre fctsignifica algo?
G-Man
0

No puedo agregar un comentario pero publico un nuevo comentario de respuesta sobre mi última respuesta.

Sí, lo sé, pero es solo un ejemplo del método, pero escribo esto tan rápido que normalmente prefiero escribir echo "${a}", lo uso ls -la ..porque quería probar mi sshd_config (ChrootDirectory) pero reescribo esto mejor:

#!/bin/bash +x

# with a varaiable or directly in file
# Replace "user", "host" and filename with your value
function list_sftp()
{
    list=`sftp user@host << EOL
    ls -la
EOL`
    echo "${list}" > tsftpres-000.txt
}

list_sftp

function other_lsftp()
{
    sftp user@host << EOL
    ls -la
EOL
}

other_lsftp > tsftpres-001.txt
Noxxod
fuente