繁体   English   中英

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

[英]Store output of command in sftp to variable and list

我的目标是创建一个 shell 脚本,以便它登录并过滤可用文件列表并选择要获取的文件。 在这里,我需要像在 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

上面的方法是行不通的。 请记住,“此处文档”( <<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会话,但这会很昂贵/效率低下。

经过一些研究和实验,找到了一种使用 sftp 创建批处理/交互式会话的方法。 作为单独的答案发布,因为我仍然相信更简单的方法是使用 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 $9}'|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 $9}'|sed -e "s/^/get -P ${fldr}\//g"|sftp_connection_string;done

让我知道它是否有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM