通过Bash脚本从SFTP获取含空格文件名的文件时遇错误求助
问题分析与解决方案
错误根源
- 尾随空格来源:SFTP的
ls -tr输出为了列对齐,会在文件名后自动补充空格,tail -n 1获取最后一行时会把这些多余空格一并带入filename变量。 - 命令传递错误:原脚本用
echo "'$cmd'"传递命令,导致单引号被当成SFTP命令的一部分,SFTP会把'get /tmp/myfiles/User data...'识别为一个完整的文件名,自然无法找到。
修复方案
方案1:清理文件名+正确传递命令
修改脚本,先清理文件名的前后空白字符,再用Here-string传递带引号的命令,让SFTP正确识别含空格的文件名:
#!/bin/bash # 获取最后一个文件并清理前后空格(包括空格、制表符) filename="$(echo "ls -tr" | sftp -i ~/.ssh/id_rsa username@host:/tmp/myfiles | tail -n 1 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # 用Here-string传递带双引号的get命令 sftp -i ~/.ssh/id_rsa username@host:/tmp/myfiles <<< "get \"/tmp/myfiles/$filename\""
方案2:使用SFTP批处理文件(更稳定)
通过临时批处理文件传递命令,避免管道传递的引号和空格问题:
#!/bin/bash filename="$(echo "ls -tr" | sftp -i ~/.ssh/id_rsa username@host:/tmp/myfiles | tail -n 1 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # 生成临时批处理文件 echo "get \"/tmp/myfiles/$filename\"" > /tmp/sftp_batch.txt # 执行SFTP批处理命令 sftp -i ~/.ssh/id_rsa -b /tmp/sftp_batch.txt username@host:/tmp/myfiles # 清理临时文件 rm /tmp/sftp_batch.txt
方案3:改用scp命令(如果服务器允许)
scp对含空格的路径支持更友好,直接用双引号包裹远程路径即可:
#!/bin/bash filename="$(echo "ls -tr" | sftp -i ~/.ssh/id_rsa username@host:/tmp/myfiles | tail -n 1 | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" # 用scp下载文件,双引号包裹远程路径 scp -i ~/.ssh/id_rsa "username@host:/tmp/myfiles/$filename" ./
内容的提问来源于stack exchange,提问作者CEamonn
相关产品推荐
相关产品推荐

