43

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

$ 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") 
4

13 回答 13

58

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

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

于 2013-08-17T15:22:17.277 回答
53

这是一个简单的方法:

#!/bin/bash
USE_IP='-o StrictHostKeyChecking=no username@192.168.1.2'

FILE_NAME=/home/user/file.txt

SSH_PASS='sshpass -p password-for-remote-machine'

if $SSH_PASS ssh $USE_IP stat $FILE_NAME \> /dev/null 2\>\&1
            then
                    echo "File exists"
            else
                    echo "File does not exist"

fi

您需要在您的机器上安装sshpass才能使用它。

于 2012-10-11T17:31:51.723 回答
46

没有比这更简单的了:)

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

正如 dimo414 所建议的,这可以折叠为:

if ssh host "test -e /path/to/file"; then
    # your file exists
fi
于 2015-04-15T01:15:40.050 回答
12

一行,正确引用

ssh remote_host test -f "/path/to/file" && echo found || echo not found
于 2015-08-28T12:19:58.587 回答
7

你缺少;s。如果将它们全部放在一行中,则一般语法是:

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

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

[不是语法,而是test程序(检查一下ls /bin/[,它确实存在,man test用于文档——尽管也可以有一个具有不同/附加功能的内置版本。)它用于测试文件和变量的各种常见条件。(请注意,[[另一方面语法,如果支持,则由您的 shell 处理)。

对于你的情况,你不想test直接使用,你想在远程主机上测试一些东西。所以尝试类似:

if ssh user@host test -e "$file" ; then ... ; else ... ; fi
于 2012-10-11T17:31:48.157 回答
3
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"

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

ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
于 2013-12-04T04:00:19.770 回答
3

测试文件是否存在:

HOST="example.com"
FILE="/path/to/file"

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

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

HOST="example.com"
FILE="/path/to/file"

if ! ssh $HOST "test -e $FILE"; then
    echo "File does not exist."
else
    echo "File exists."
fi
于 2018-02-06T04:40:39.560 回答
1

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

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

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

# 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
}

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

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
于 2013-12-09T16:28:45.237 回答
1

静默检查文件是否存在,如果不存在则执行

if ! ssh $USER@$HOST "test -e file.txt" 2> /dev/null; then
  echo "File not exist"
fi
于 2021-08-20T14:44:20.587 回答
0

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

最后,我做了简短的功能,效果很好:

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
}
于 2016-07-12T11:40:33.747 回答
0

在 CentOS 机器上,对我有用的 oneliner bash 是:

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

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

于 2016-12-29T13:38:20.880 回答
-1

这也有效:

if ssh user@ip "[ -s /path/file_name ]" ;then 
  status=RECEIVED ; 
 else 
  status=MISSING ; 
 fi
于 2019-09-11T11:24:50.587 回答
-1
#its simple

if [[ "`ssh -q user@hostname ls /dir/filename.abc 2>dev/null`" == "/dir/filename.abc" ]]
then
    echo "file exists"
else
    echo "file not exists"
fi
于 2021-03-31T14:47:26.533 回答