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



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

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

我如何设置我的参数:

#!/bin/bash
DIR="$1"
URL="$2"
FILES="$DIR*.ext"

我的问题是格式化url。

不带格式

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

#!/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

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

$ ~/backup /path/to/local/folder/ user@server.com:

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

$ ~/backup /path/to/local/folder/ user@server.com:/path/to/remote/folder/

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

ssh: Could not resolve hostname user@server.com: nodename nor [...]
Can't upload /path/to/local/folder/file.ext to user@server.com

而且它仍然有效(文件被复制)。但这不是一个解决方案,因为当scp失败时(看起来),文件永远不会被删除。

带格式

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

#!/bin/bash
for F in $FILES
do
scp $F "$URL:"
done

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

$ ~/backup /path/to/local/folder/ user@server.com

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

最后

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

您的错误是您可以将scp连接到user@server.com:,但不能将ssh连接到它:您需要删除后面的:字符(以及它之后可能的路径)。使用bash参数扩展:可以很容易地完成此操作

ssh "${URL%:*}" stat "$(basename "$F")"

建议

  • "多引用!"它们至关重要。此外,还要了解"and"one_answers"and"之间的区别。请参阅http://mywiki.wooledge.org/Quotes和http://wiki.bash-hackers.org/syntax/words
  • 如果文件名中有空格,则代码会将内容分解。更好地使用while IFS= read -r line; do #stuff with $line; done < file.txt
  • 参见bash参数扩展

相关内容

  • 没有找到相关文章

最新更新