我正在编写一个 bash 脚本来将文件从远程服务器复制到我的本地计算机。我需要检查该文件是否可用,因此如果不存在,我可以采取替代操作。
我知道如何测试本地文件是否存在,但是,使用 scp 会使事情变得有点复杂。常识告诉我,一种方法是无论如何尝试 scp 文件,并检查 scp 命令的返回代码。这是正确的做法吗?
如果是,如何测试 scp 调用的返回代码?
使用 ssh + cmd 行中嵌入的一些 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)或完成之后。
好吧,既然您可以使用
scp
,您可以尝试使用 ssh
列出并查看该文件是否是他们的,然后再继续。
在执行 scp 之前,您必须运行 ssh 命令并检查文件或目录。我正在使用 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_[email protected] "stat write_filename_here"
不要忘记通过brew或apt在你的机器上安装sshpass
此外,如果您要检查的文件不存在于同一目录中,则像这样检查文件
if ssh write_remote_host_here "cd /destination_directory_path_here; stat write_filename_here"; then