我想从远程服务器获取文件列表,并将该列表放在本地文件或数组中。遍历文件列表并一次从远程到本地获取每个文件。 但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附近抛出无效的命令错误并获得。
答案 0 :(得分:0)
假设:
ssh/find
结果直接提供给while
循环)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
循环,完成后删除文件名文件scp/ssh
来电以上内容的变体:
scp
(或sftp/mget
)命令一次性提取所有文件scp
此“rm”文件命令远程主机的/tmp
ssh
到远程主机和a)chmod 700
'rm'文件然后执行文件或b)获取'rm'文件;完成后删除'rm'文件scp/ssh
来电当然,如果您计划经常执行此操作,可能值得花一些时间来查看是否可以使用共享文件系统设置2个主机,从而无需在以下位置执行任何ssh/scp/sftp
调用所有