我在下面提供了我自己的答案。
我们有许多使用 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
答案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