将url传递给bash脚本以在scp中使用

mux*_*sar 3 ssh bash scp

我正在写一个cron来备份服务器上的一些东西.基本上我是使用scp从本地目录发送特定文件.我正在使用公钥来避免身份验证.

为了可重用,我通过参数传递本地目录和服务器url到我的bash脚本.

我如何设置参数:

#!/bin/bash

DIR="$1"
URL="$2"
FILES="$DIR*.ext"
Run Code Online (Sandbox Code Playgroud)

我的问题是关于格式化网址.

没有格式化

我如何将文件发送到服务器:

#!/bin/bash

for F in $FILEs
do
    scp $F $URL;

    if ssh $URL stat $(basename "$F")
    then
        rm $F
    else 
        echo "Fails to copy $F to $URL"
    fi
done
Run Code Online (Sandbox Code Playgroud)

如果我尝试在服务器上的用户家中复制,我会:

$ ~/backup /path/to/local/folder/ user@server.com:
Run Code Online (Sandbox Code Playgroud)

如果我尝试复制服务器上的特定目录,我会:

$ ~/backup /path/to/local/folder/ user@server.com:/path/to/remote/folder/
Run Code Online (Sandbox Code Playgroud)

在所有情况下,它给我一个众所周知的错误(和我的自定义回声):

ssh: Could not resolve hostname user@server.com: nodename nor [...]
Can't upload /path/to/local/folder/file.ext to user@server.com
Run Code Online (Sandbox Code Playgroud)

无论如何它都有效(文件被复制).但这不是解决方案,因为scp失败(似乎),文件永远不会被删除.

格式化

我尝试使用此方法发送文件:

#!/bin/bash

for F in $FILES
do
    scp $F "$URL:"
done
Run Code Online (Sandbox Code Playgroud)

我不再收到错误,它可以复制到用户的主目录,然后删除本地文件:

$ ~/backup /path/to/local/folder/ user@server.com
Run Code Online (Sandbox Code Playgroud)

但是,当然,发送到特定目录根本不起作用.

最后

所以我认为我的第一种方法更合适,但我怎样才能摆脱这种错误呢?

Gil*_*not 5

你的错误是,你可以scpuser@server.com:,但不能ssh把它:你需要删除尾随:(之后和可能的路径)字符.您可以使用bash 参数扩展轻松完成此操作:

ssh "${URL%:*}" stat "$(basename "$F")"
Run Code Online (Sandbox Code Playgroud)

建议