[英]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.