我使用的是CentOS Linux。
在一行 cmd 中,如果成功则返回 0,如果失败则返回非 0,我需要:
- 将文件传输到远程服务器。
- 如果远程服务器中存在文件名,则不传输文件(返回非 0)
我想过使用rsync
,但如果文件名存在它会返回 0 。
scp
替换现有文件,所以它对我也没有帮助。
一个转折:执行该命令的用户是不是root,文件归该用户所有。目的地由同一用户拥有。ssh
对 root存在信任。但不适用于该用户。无法提示输入密码,因为此命令是自动脚本的一部分。可以进行初步配置步骤。我可以将它们添加为一次性配置。有人可以帮忙吗?
答案1
这是一种不保留元数据的简单方法:
ssh server.example.com 'set -C; cat >/path/to/remote/file' </path/to/local/file
您可以使用 rsync 并使用正确的选项来完成此操作。如果文件存在,返回码将为 0,但您可以从详细输出中找到。
changes=$(rsync -a --ignore-existing --itemize-changes \
/path/to/local/file server.example.com:/path/to/remote/file)
if [ $? -ne 0 ]; then
echo >&2 "Some error occured"
return 2
elif [ -n "$changes" ]; then
echo "The file was copied"
return 0
else
echo "The file already existed"
return 1
fi
答案2
首先检查远程主机上是否存在该文件:
if ! ssh remotehost [ -f incoming/DB1026910.sql ]; then
scp DB1026910.sql remotehost:incoming/
fi