使用SCP命令检查远程文件是否存在

18
我正在编写一个bash脚本,将文件从远程服务器复制到我的本地机器。我需要检查文件是否可用,以便在它不存在时采取替代操作。
我知道如何测试本地文件是否存在,但是使用scp会使事情变得有些复杂。常识告诉我一种方法是尝试无论如何都使用scp命令来获取文件,并检查scp命令的返回代码。这是正确的做法吗?
如果是,我该如何测试scp调用的返回代码?
3个回答

15

使用ssh +嵌入在命令行中的一些shell代码;当您需要在文件传输失败之前做出决策时,请使用此方法;

ssh remote-host 'sh -c "if [ -f ~/myfile ] ; then gzip -c ~/myfile ; fi" ' | gzip -dc > /tmp/pkparse.py

如果你想传输目录,可以先使用"tar"命令进行打包。

如果要使用scp命令,可以像这样检查返回代码:

if scp remote-host:~/myfile ./ >&/dev/null ; then echo "transfer OK" ; else echo "transfer failed" ; fi

这取决于您何时需要知道文件是否存在:在传输开始之前(使用ssh+sh)还是在传输完成后。


重要的是要考虑是否需要在客户端而非服务器端进行控制,以便能够继续处理。这在远程客户端基于“令牌”文件进行“拉取”操作时非常常见。 - mckenzm

0
嗯,既然你可以使用scp,那你可以尝试使用ssh来列出并查看文件是否存在,然后再继续操作。

0
你需要运行ssh命令,在执行scp之前检查文件或目录。我使用stat命令来验证文件/目录的存在。我编写的脚本用于检查和传输文件。
if ssh write_remote_host_here "stat write_filename_here"; then
   echo "file already exist"
else
   scp write_filename_here write_remote_host_here:destination_directory_here

如果SSH不能按照这种方式工作并要求密码,请在任何ssh或scp命令之前考虑使用sshpass,并且您需要这样写:
sshpass -p write_password_here ssh write_remote_host_like_root@168.122.x.y "stat write_filename_here"

不要忘记通过brew或apt在您的机器上安装sshpass。
另外,如果您要检查的文件不在同一目录中,请按照以下方式检查文件。
if ssh write_remote_host_here "cd /destination_directory_path_here; stat write_filename_here"; then

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接