ls不在sftp korn shell中工作,命令不在for循环中工作

时间:2017-08-17 20:51:20

标签: for-loop get sftp ksh ls

我想从远程服务器获取文件列表,并将该列表放在本地文件或数组中。遍历文件列表并一次从远程到本地获取每个文件。 但ls命令无法在远程服务器上运行,并且get命令无法正常工作。 以下是我的剧本:

#!/user/bin/ksh
Sftp ruser@rhost <<EOF
Cd source_path
Set -A list_value $(ls source_path)
for file in ${list_value[*]}
do
get /source_path/$file /dest_folder
If ($? -eq 0); then
rm /source_path/$file
else
echo "error"
Exit
fi
done
Bye
EOF

我甚至尝试过

ls source_path > output.txt

什么都没有用。在本地它使用数组,但for循环中的命令不会被执行。在远程la不工作。我甚至尝试使用echo *并找到它。它在ls附近抛出无效的命令错误并获得。

1 个答案:

答案 0 :(得分:0)

假设:

  • 您希望稍后使用文件名数组(否则我可能只是将ssh/find结果直接提供给while循环)
  • 您的远程主机可能是solaris(不支持find/maxdepth),在这种情况下,我们必须使用一些时髦的find命令来模拟maxdepth=1
  • 您已将帐户设置为允许无密码ssh/scp来电

这是一种做你想做的事情的方法:

$ cat mycp
#!/bin/ksh

# replace `source_path' and 'dest_folder' accordingly

remotedir=source_path
localdir=dest_folder

# the 'find' is a bit funky to allow us to emulate find/maxdepth if remote host is solaris
# 'sed' command strips off the leading 2 characters (./) of the result

set -A farray $( ssh ruser@rhost "cd ${remotedir} ; find . -name . -o -type d -prune -o -name '*' -print" | sed -r 's/^.{2}//' )

# iterate through the array

for i in ${!farray[@]}
do
    # pull array element into variable => less typing for rest of loop

    fname=${farray[${i}]}

    # replace 'scp' with comparable 'sftp' if you wish

    scp -p ruser@rhost:${remotedir}/${fname} ${localdir}

    # if file exists locally, then remove remotely

    [ -f ${localdir}/${fname} ] && ssh ruser@rhost "'rm' -rf ${remotedir}/${fname}"
done

使用scp/ssh调用重复后退n-forth并不完全有效,但编码相当简单。

更高效的流程需要更多的编码,但如果您不打算经常运行此流程或使用相对较少的文件,则可能会过度。一种方法看起来像这样:

  • 使用单个scp(或sftp/mget)命令一次性提取所有文件
  • 构建您刚刚复制并放在文件中的文件列表
  • scp(或sftp)此文件名文件返回远程主机(例如,放在/tmp
  • ssh到远程主机并使用该文件名文件来驱动while/rm循环,完成后删除文件名文件
  • 结果:3 scp/ssh来电

以上内容的变体:

  • 使用单个scp(或sftp/mget)命令一次性提取所有文件
  • 而不是文件名文件,构建'rm'命令文件
  • scp此“rm”文件命令远程主机的/tmp
  • ssh到远程主机和a)chmod 700'rm'文件然后执行文件或b)获取'rm'文件;完成后删除'rm'文件
  • 结果:3 scp/ssh来电

当然,如果您计划经常执行此操作,可能值得花一些时间来查看是否可以使用共享文件系统设置2个主机,从而无需在以下位置执行任何ssh/scp/sftp调用所有