如何使用SFTP连接构建脚本bash来拉取文件

时间:2017-11-21 14:09:03

标签: bash unix sftp

我实现代理脚本bash以使用SFTP服务从远程服务器提取文件。 该脚本必须:

  1. 连接SFTP
  2. 文件列表
  3. 在发现的文件上骑自行车
  4. 获取每个文件并复制代理端
  5. 之后必须删除复制的文件
  6. 遵循脚本:

     #!/bin/bash
    
    SFTP_CONNECTION="sftp -oIdentityFile=/home/account_xxx/.ssh/service_ssh user@host"
    
    DEST_DATA=/tmp/test/data/
    
    # GET list file by ls command ###############
    
    $SFTP_CONNECTION
    $LIST_FILES_DATA_OSM1 = $("ls fromvan/test/data/test_1")
    echo $LIST_FILES_DATA_OSM1
    
    
    for file in "${LIST_FILES_DATA_OSM1[@]}"
           do
                    $SFTP_CONNECTION get $file $DEST_DATA
                    $SFTP_CONNECTION rm $file
           done
    

    我尝试了脚本,但似乎连接和命令执行(ls)在线程分离时是不同的。 如何按上述方式提供命令顺序?

    Screenshoot:

    enter image description here

    无效的查找命令

    enter image description here

    SSH似乎不可用

    enter image description here

    采取文件的RSYNC结果如下:

    enter image description here

    由于

2 个答案:

答案 0 :(得分:1)

首先,我建议更改以下语法:

#!/bin/bash

sftp_connection() { 
    sftp -oIdentityFile=/home/account_xxx/.ssh/service_ssh user@host "$@"; 
}

Dest_Data=/tmp/test/data/

# GET list file by ls command ###############

sftp_connection
List_Files_D_OSM1=$("ls fromvan/test/data/test_1")
echo "$LIST_FILES_DATA_OSM1"


for file in "${LIST_FILES_DATA_OSM1[@]}"
    do
        sftp_connection get "$file" $Dest_Data
        sftp_connection rm "$file"
    done
  • 引用$file$List_Files_D_OSM1以防止通配和分词。
  • 分配不能以$开头,否则bash会尝试执行List_Files_D_OSM1并会抱怨command not found
  • List_Files_D_OSM1 = $("ls fromvan/test/data/test_1")
  • 等作业中没有空格

您可以使用ShellCheck来捕获此类错误。

话虽如此,it is in general not a good idea to use ls in such way.

您可以使用的内容类似于find。例如:

find . -type d -exec echo '{}' \;

答案 1 :(得分:0)

使用其他客户端。 lftp支持sftp作为传输,并且有一个镜像子命令,用于列出远程目录并为您迭代文件。

假设您的~/.ssh/config包含以下条目:

Host myhost
    IdentityFile /home/account_xxx/.ssh/service_ssh

...你可以跑:

lftp -e 'mirror -R fromvan/test/data/test_1 /tmp/test/data' sftp://user@myhost