将 sftp 中命令的输出存储到变量和列表中

Store output of command in sftp to variable and list

我的目标是创建一个 shell 脚本,以便它登录并过滤可用文件列表和 select 要获取的文件。在这里我需要像 bash 中那样的 运行 命令。 我的示例代码是:

sshpass -p password sftp user@10.10.10.10 <<EOF
cd /home/
var=$(ls -rt)
echo $var
echo "select a folder"
read folder
cd $folder
filen=&(ls -rt)
echo $filen
echo "select a file"
read name
get $name
bye
EOF

以上方法行不通。请记住,'here document' (<<EOF ... EOF) 被评估为 sftp 会话的输入。将显示提示,并要求用户输入,然后才能从 sftp 获得任何输出(在本例中为 ls)。

考虑使用 lftp,它具有更灵活的结构。特别是,它可以让您使用变量、动态创建命令等。

lftp sftp://user@host <<EOF

cd /home
ls
echo "Select Folder"
shell 'read folder ; echo "cd $folder" >> temp-cmd'
source temp-cmd

ls
echo "Select Folder"
shell 'read file ; echo "get $file" >> temp-cmd'
source temp-cmd

EOF

理论上,您可以使用管道和 sftp(可能是协同处理?)创建类似的结构,但这要困难得多。

当然,另一种选择是创建不同的 sftp 会话用于列表,但这将是 expensive/inefficient。

经过一些研究和实验,找到了一种使用 sftp 创建 batch/interactive 会话的方法。 作为单独的答案发布,因为我仍然相信更简单的方法是使用 lftp(参见其他答案)。可以在没有 lftp

的系统上使用

初始 exec 创建 FD#3 - 指向原始标准输出 - 可能是用户终端。发送到标准输出的任何内容都将由管道中的 sftp 执行。

管道需要允许两个进程同时 运行。使用 here doc 将导致顺序执行。需要 sleep 语句以允许 SFTP 完成从远程主机的数据检索。


exec 3>&1
(
   echo "cd /home/"
   echo "ls"
   sleep 3    # Allow time for sftp 
   echo "select a folder" >&3
   read folder
   echo "cd $folder"
   echo "ls"
   sleep 3     # Allow time for sftp
   echo "select a file" >&3
   read name
   echo "get $name"
   echo "bye"
) | sshpass -p password sftp user@10.10.10.10

我建议您创建一个包含您要下载的文件模式的文件,然后您就可以在一行中下载文件:

sftp_connection_string <<< $"ls -lrt"|grep -v '^sftp'|grep -f pattern_file|awk '{print $9}'|sed -e 's/^/get -P /g'|sftp_connection_string

如果有多个确定的文件夹要查看,则:

**Script version**
for fldr in folder1 folder2 folder3;do
    sftp_connection_string <<< $"ls -lrt ${fldr}/"|grep -v '^sftp'|grep -f pattern_file|awk '{print }'|sed -e "s/^/get -P ${fldr}/g"|sftp_connection_string
done

单行

for fldr in folder1 folder2 folder3;do sftp_connection_string <<< $"ls -lrt ${fldr}/"|grep -v '^sftp'|grep -f pattern_file|awk '{print }'|sed -e "s/^/get -P ${fldr}\//g"|sftp_connection_string;done

让我知道它是否有效。