我实现代理脚本bash以使用SFTP服务从远程服务器提取文件。 该脚本必须:
遵循脚本:
#!/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:
无效的查找命令
SSH似乎不可用
采取文件的RSYNC结果如下:
由于
答案 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