使用shell脚本进行SFTP文件操作

使用shell脚本进行SFTP文件操作,shell,sftp,Shell,Sftp,有没有人尝试过使用shell脚本访问和操作SFTP服务器中的文件?基本上,我要做的是: 1.打开SFTP,访问指定目录 2.循环浏览所有.txt文件 3.读取每个.txt文件的文件名,只获取包含/s“XX”子字符串的文件 i、 e.hello-XX.txt 4.通过附加'-OK'字符串重命名该文件 i、 e.hello-XX-OK.txt 感谢您的投入。这就是我们的目的。大致: #!/PATH/TO/expect -f spawn sftp host expect -re "Username:"

有没有人尝试过使用shell脚本访问和操作SFTP服务器中的文件?基本上,我要做的是: 1.打开SFTP,访问指定目录 2.循环浏览所有.txt文件 3.读取每个.txt文件的文件名,只获取包含/s“XX”子字符串的文件 i、 e.hello-XX.txt 4.通过附加'-OK'字符串重命名该文件 i、 e.hello-XX-OK.txt

感谢您的投入。

这就是我们的目的。大致:

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

您可以使用here文档编写SFTP脚本说明中的任何内容都不要求您在SFTP服务器上运行任何逻辑。您可以使用sftp命令获取数据并在本地进行处理,例如:

for file in $(echo 'ls -1' | sftp blah | tail -n +2); do
  # do stuff
done

让我们使用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);

这是我为自己的目的而工作的起点。我使用的是sshpass,这样可以指定密码,但是如果您正确交换了RSA公钥,那么您应该能够删除额外的goo

#!/bin/bash

function sftpexec()
{
    (SSHPASS="password" sshpass -e sftp user@server | tail -n +2) << !
$1
!
}

FILES=$(sftpexec ls)
echo $FILES

这将在起始目录中列出服务器上的所有文件。

A shebang!行通常只接受指定命令的一个参数/usr/bin/env expect-f可能不起作用。如果expect位于/usr/bin中,只需使用/usr/bin/expect-f。有关env hack的讨论,请参阅和。谢谢-尝试太聪明了,这在python中总是有效的。嗨,Vanza,你能详细介绍一下我如何循环通过SFTP服务器中的特定目录吗?@MarkBernabe:我刚刚做了,读了我发布的代码。它在sftp服务器主目录中的文件中循环。根据您的需要修改它。嗨,Christian,有基于SSH的脚本示例吗?请使用一些脚本语言Perl、Python、Ruby等和合适的模块来代替shell。嗨,Salva,我正在使用shell,因为我需要在unix中运行的SAP PI中实现它。如果您可以运行shell脚本,您可以运行任何其他脚本。当前千年中部署的任何Unix系统至少都有Perl作为基本操作系统安装的一部分。@MarkBernabe-您在这方面取得了很大进展吗?我刚开始从一个BASH脚本通过sshpass自动化sftp,您的问题会首先弹出,但没有非常令人满意的答案: