2

尝试在 bash 中使用 scp 将远程文件复制到我的本地系统,
我已经获得了我想要的文件名并分配给变量,$lastModifiedFile
问题是它在文件名中包含空格。
要将此变量与 scp 一起使用,需要使用反斜杠对空格进行转义。
有没有一种简单的方法来格式化这个变量并在必要的地方插入正确的转义字符,即在空格上?

#!/bin/bash

lastModifiedFile=$(sshpass -p 'passw0rd' ssh user@server 'ls -tr /path/output*| tail -n 1')
echo "$lastModifiedFile"

sshpass -p 'passw0rd' scp user@server:"$lastModifiedFile" /root/

这是脚本输出..

[user@host ~]# ./script.sh 
/path/outputSat Mar 09 151905 GMT 2013.html
scp: /path/outputSat: No such file or directory
scp: Mar: No such file or directory
scp: 09: No such file or directory
scp: 151905: No such file or directory
scp: GMT: No such file or directory
scp: 2013.html: No such file or directory

我正在寻找类似下面的东西,甚至是更简单的解决方案?..

escapedFilename=""

for letter in $lastModifiedFile
    if $letter == " "
        $escapedFilename += "\ "
    else
        $escapedFilename += $letter
4

4 回答 4

1

在传递给远程系统的文件名周围使用单引号,这样它就不会被分词。

lastModifiedFile=$(sshpass -p 'passw0rd' ssh user@server 'ls -tr /path/output*| tail -n 1')
echo "$lastModifiedFile"

sshpass -p 'passw0rd' scp user@server:"'$lastModifiedFile'" /root/

或者

sshpass -p 'passw0rd' scp "user@server:'$lastModifiedFile'" /root/
于 2013-03-10T02:33:14.647 回答
1

有点倾斜牙签综合症:

param=user@server:${lastModifiedFile// /\\ /}

sshpass -p 'passw0rd' scp "$param" /root/

编辑:它似乎scp不喜欢我。我需要在测试中增加一个额外的变量级别...... :)

编辑2:根据OP的反馈,确切的解决方案似乎包括使用${lastModifiedFile// /\\ \\} 我只是希望除了空格之外没有其他字符需要在其他文件名中转义:)

于 2013-03-09T17:12:37.457 回答
0

这里有几个方法可以处理文件名中的几乎所有内容(不仅仅是空格)。首先,bash 的printf内置有一种%q格式,可以在字符串中添加引号/转义/任何内容:

sshpass -p 'passw0rd' scp user@server:"$(printf %q "$lastModifiedFile")" /root/

但是请注意,这引用/转义/等它适合 bash 解释。如果远程计算机的默认外壳是别的东西,这可能不适用于所有情况。

选项二原则上更简单(但在实践中有点混乱),并且应该与更远程的 shell 兼容。在这里,我将文件名括在单引号中,这应该适用于文件名中的单引号以外的任何内容。对于那些,我替换'\''(结束单引号字符串,添加转义单引号,然后重新启动单引号字符串):

repl="'\''" # Have to store this in a variable to work around a bash parsing oddity
sshpass -p 'passw0rd' scp user@server:"'${lastModifiedFile//\'/$repl}'" /root/
于 2013-03-10T01:28:24.647 回答
0

这样做:

sshpass -p 'passw0rd' scp 'user@server:$lastModifiedFile' /root/
于 2013-03-09T17:05:25.150 回答