【问题标题】:SFTP file manipulation using shell script使用 shell 脚本操作 SFTP 文件
【发布时间】:2013-10-23 02:27:34
【问题描述】:

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

感谢您的意见。

【问题讨论】:

  • 使用一些脚本语言(Perl、Python、Ruby 等)和合适的模块来代替 shell。
  • 嗨 Salva,我正在使用 shell,因为我需要在运行在 unix 中的 SAP PI 中实现它。
  • 如果您可以运行 shell 脚本,您可以运行任何其他脚本。当前千禧年部署的任何 Unix 系统都至少将 Perl 作为基本操作系统安装的一部分提供。
  • @MarkBernabe - 你在这方面取得了很大进展吗?我刚开始从 BASH 脚本中自动化 sftp(通过 sshpass),你的问题首先弹出,但没有非常令人满意的答案。 :)

标签: shell sftp


【解决方案1】:

您可以使用“此处文档”(<<EOF,指定为 here)编写 SFTP 脚本,但您将无法在 SFTP 脚本中使用类似于 shell 脚本的原语(la bash)。

如果您有 SSH 访问权限,不妨尝试使用基于 SSH 的脚本。

【讨论】:

  • 嗨 Christian,有任何基于 SSH 的脚本示例吗?
【解决方案2】:

您的描述中没有任何内容要求您在 sftp 服务器上运行任何逻辑。您可以使用 sftp 命令获取数据并在本地进行处理,例如:

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

【讨论】:

  • 嗨 Vanza,您能详细说明我如何循环通过 SFTP 服务器中的特定目录吗?
  • @MarkBernabe:我刚刚做了,阅读我发布的代码。它遍历 sftp 服务器上主目录中的文件。根据您的需要进行修改。
【解决方案3】:

这就是expect 的用途。大致:

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

【讨论】:

  • 一个shebang(#! line)通常只接受指定命令的一个参数; #!/usr/bin/env expect -f 可能不起作用。如果expect/usr/bin 中,只需使用#!/usr/bin/expect -f。有关“env hack”的讨论,请参阅 this questionmy answer
  • 谢谢 - 太聪明了(这在 python 中总是有效的)。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    #!/bin/bash
    
    function sftpexec()
    {
        (SSHPASS="password" sshpass -e sftp user@server | tail -n +2) << !
    $1
    !
    }
    
    FILES=$(sftpexec ls)
    echo $FILES
    

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

    【讨论】: