我正在编写一个cron来备份服务器上的一些东西。 基本上我是使用scp从本地目录发送特定文件。 我正在使用公钥来避免身份验证。
为了可重用性,我通过参数传递本地目录和服务器URL到我的bash脚本。
我如何设置参数:
#!/bin/bash
DIR="$1"
URL="$2"
FILES="$DIR*.ext"
我的问题是关于格式化网址。
我如何将文件发送到服务器:
#!/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
但是,当然,发送到特定目录根本不起作用。
所以我认为我的第一种方法更合适,但我怎样才能摆脱这种错误?
答案 0 :(得分:5)
您的错误是您可以scp
到user@server.com:
但不能ssh
:您需要删除尾随的:
字符(以及后面的可能路径)。您可以使用bash
参数展开:
ssh "${URL%:*}" stat "$(basename "$F")"
<强>建议强>
while IFS= read -r line; do #stuff with $line; done < file.txt