通过 SFTP 将文件列表保存到文本文件

通过 SFTP 将文件列表保存到文本文件

我在下面提供了我自己的答案。

我们有许多使用 SFTP 可以正常工作的 bash 脚本,我想做的就是简单地将文件夹的 ls 或 dir 重定向到我们的 SFTP 服务器上的文件。

我们可以将其作为 cron 作业运行,也可以手动运行它。我可以查看远程服务器中的文件列表,但我想在文本文件中生成从远程服务器到本地服务器的文件列表。 。

这是到目前为止我对 bash 脚本的了解。下面列出的第四个 echo 是有问题的行。

#!/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

答案1

命令sftp非常有限。如果你不能让它做你想要的事情,你可以使用另一种方法,即使用SSHFS文件系统。 SSHFS使用SFTP作为传输协议,因此服务器端只看到一个SFTP客户端。您需要能够使用保险丝在客户端。

使用 SSHFS,您可以将远程目录挂载到现有的空目录并使用普通命令。

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

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

fusermount -u remote
rmdir remote

答案2

这是迄今为止效果最好的:

echo 'ls' | sftp hostname

您可以通过以下方式将输出转发到文件中

echo 'ls' | sftp hostname > /tmp/mylist.txt

答案3

dir客户端内的命令不sftp支持重定向。下面的示例显示了它如何不执行任何操作。

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>

手册页sftp确认。

ls[-1afhlnrSt] [path]

    显示远程目录列表path或当前目录,如果path没有指定。  path可能包含 glob(3) 字符并且可能匹配多个文件。

    以下标志被识别并改变行为ls因此:

    -1

        产生单柱状输出。
    -a
        列出以点 (' .') 开头的文件。
    -f
        不要对列表进行排序。默认排序顺序是字典顺序。
    -h
        与长格式选项一起使用时,请使用单位后缀:字节、千字节、兆字节、千兆字节、太字节、拍字节和艾字节,以便使用 2 的幂大小将位数减少到四位或更少(K=1024,M =1048576等)。
    -l
        显示其他详细信息,包括权限和所有权信息。
    -n
        生成一个长列表,其中包含以数字形式显示的用户和组信息。
    -r
        反转列表的排序顺序。
    -S
        按文件大小对列表进行排序。
    -t
        按上次修改时间对列表进行排序。

答案4

您还可以使用lftp

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

或者

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

lftp还有一个find用于递归列表的命令。

在命令行上传递密码通常是一个坏主意。另一种方法是如果可能的话使用 ssh 密钥身份验证(如果密钥身份验证可用,上面的密码将被忽略,因此您将其设置为空字符串)。或者你可以通过环境传递它:

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

或者通过 stdin 传递命令,此处使用此处文档(使用已删除的临时文件或管道实现,具体取决于 shell):

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

相关内容