有没有人尝试使用 shell 脚本访问和操作 SFTP 服务器中的文件 基本上,这就是我要做的: 1. 打开 SFTP,访问指定目录 2. 遍历所有 .txt 文件 3. 读取每个 .txt 文件的文件名并且只获取包含/s'XX'子字符串的文件/s(即hello-XX.txt)4.通过附加'-OK'字符串重命名该文件(iehello-XX-OK.txt)
感谢您的投入。
让我们为此使用 Perl:
#!/usr/bin/perl
use Net::SFTP::Foreign;
$sftp = Net::SFTP::Foreign->new($host, user => $user, autodie => 1);
$sftp->setcwd($dir);
$sftp->mget("*XX*.txt", $local_dir);
这就是期望的。大致:
#!/PATH/TO/expect -f
spawn sftp host
expect -re "Username:"
send -- "MYUSER\r"
expect -re "Password:"
send -- "PASSWORD\r"
expect -re "ftp>"
send -- "cd mydir\r"
expect -re "ftp>"
send -- "get myfile\r"
...
您可以使用“此处的文档”(<<EOF
如在此处指定)为 SFTP 编写脚本,但您将无法在 SFTP 脚本中使用类似 shell 脚本的原语(la bash)。
如果您有 SSH 访问权限,也许可以尝试使用基于 SSH 的脚本。
您的描述中没有任何内容要求您在 sftp 服务器上运行任何逻辑。您可以使用 sftp 命令获取数据并在本地进行处理,例如:
for file in $(echo 'ls -1' | sftp blah | tail -n +2); do
# do stuff
done
这是我为自己的目的而工作的起点。我正在使用sshpass
以便可以指定密码,但如果您正确交换了 RSA 公钥,您应该能够删除额外的粘性。
#!/bin/bash
function sftpexec()
{
(SSHPASS="password" sshpass -e sftp user@server | tail -n +2) << !
$1
!
}
FILES=$(sftpexec ls)
echo $FILES
这将做的是在起始目录中列出服务器上的所有文件。