关于linux:使用ssh检查远程主机上是否存在文件

check if file exists on remote host with ssh

我想检查远程主机上是否存在某个文件。我试过这个:

1
2
$ if [ ssh user@localhost -p 19999 -e /home/user/Dropbox/path/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo"okidoke"; else"not okay!" fi
-sh: syntax error: unexpected"else" (expecting"then")


除了上面的答案,还有一种速记方法:

1
ssh -q $HOST [[ -f $FILE_PATH ]] && echo"File exists" || echo"File does not exist";

-q是安静模式,它将抑制警告和消息。

正如@mat所提到的,这种测试的一个优点是,您可以很容易地将-f换成您喜欢的任何测试操作员:-nt-d-s等。

测试操作员:http://tldp.org/ldp/abs/html/fto.html


下面是一个简单的方法:

1
2
3
4
5
6
7
if ssh $HOST stat $FILE_PATH \> /dev/null 2\>\&1
            then
                    echo"File exists"
            else
                    echo"File does not exist"

fi


再简单不过了:)

1
2
3
4
ssh host"test -e /path/to/file"
if [ $? -eq 0 ]; then
    # your file exists
fi


一行,正确报价

1
ssh remote_host test -f"/path/to/file" && echo found || echo not found

您缺少;。如果将其全部放在一行中,一般的语法是:

1
if thing ; then ... ; else ... ; fi

thing几乎可以是返回退出代码的任何东西。如果thing返回0,则取then分支,否则取else分支。

[不是语法,它是test程序(查看ls /bin/[,它实际上存在,man test用于文档–虽然也可以有具有不同/附加功能的内置版本),用于测试文件和变量的各种常见条件。(注意,另一方面,[[是语法,如果shell支持,它将由shell处理)。

对于您的情况,您不希望直接使用test,而是希望在远程主机上测试一些东西。因此,尝试以下方法:

1
if ssh user@host test -e"$file" ; then ... ; else ... ; fi


测试文件是否存在:

1
2
3
4
5
6
7
8
HOST="example.com"
FILE="/path/to/file"

if ssh $HOST"test -e $FILE"; then
    echo"File exists."
else
    echo"File does not exist."
fi

相反,测试文件是否不存在:

1
2
3
4
5
6
7
8
HOST="example.com"
FILE="/path/to/file"

if ! ssh $HOST"test -e $FILE"; then
    echo"File does not exist."
else
    echo"File exists."
fi


1
ssh -q $HOST [[ -f $FILE_PATH ]] && echo"File exists"

上面将在运行ssh命令的计算机上运行echo命令。要让远程服务器运行命令:

1
ssh -q $HOST"[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"

您可以指定远程主机在本地使用的shell。

1
echo 'echo"Bash version: ${BASH_VERSION}"' | ssh -q localhost bash

并且小心地(单引号)引用您希望由远程主机扩展的变量;否则变量扩展将由本地shell完成!

1
2
3
4
5
6
7
# example for local / remote variable expansion
{
echo"[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" |
    ssh -q localhost bash
echo '[[ $- == *i* ]] && echo"Interactive" || echo"Not interactive"' |
    ssh -q localhost bash
}

因此,要检查远程主机上是否存在某个文件,可以执行以下操作:

1
2
3
4
5
6
7
8
host='localhost'  # localhost as test case
file='~/.bash_history'
if `echo 'test -f '"${file}"' && exit 0 || exit 1' | ssh -q"${host}" sh`; then
#if `echo '[[ -f '"${file}"' ]] && exit 0 || exit 1' | ssh -q"${host}" bash`; then
   echo exists
else
   echo does not exist
fi

在Centos机器上,为我工作的Oneline bash是:

1
if ssh <servername>"stat <filename> > /dev/null 2>&1"; then echo"file exists"; else echo"file doesnt exits"; fi

它需要I/O重定向(作为最上面的答案)以及围绕要在远程上运行的命令的引号。


我还想检查远程文件是否存在,但使用rsh。我尝试过以前的解决方案,但它们不适用于RSH。

最后,我做了一个简短的函数,它工作得很好:

1
2
3
4
5
6
7
8
9
10
11
12
function existRemoteFile ()
{
REMOTE=$1
FILE=$2
RESULT=$(rsh -l user $REMOTE "test -e $FILE && echo "0" || echo "1"")
if [ $RESULT -eq 0 ]
then
    return 0
else
    return 1
fi
}