2012-10-11 78 views
18

我想检查远程主机上是否存在某个文件。 我尝试这样做:用ssh检查远程主机上是否存在文件

$ if [ ssh [email protected] -p 19999 -e /home/reg/Dropbox/New_semiosNET/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") 
+0

你试图执行该文件... –

+1

一般情况下, 'then'前面需要一个分号:'if cmd;然后cmd;其他cmd; fi' –

回答

23

这个问题的答案无处不在。以下是一个简单的方法。

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

fi 
+0

如何反转if? '如果[-n ...]'? – redolent

+0

你可以通过添加感叹号来反转if! – Ernestas

+10

如果你只是使用'test'而不是'stat',这会更好。 'test'是IEEE标准。 'stat'是非标准的。 'test'在失败时不会输出消息,它只是返回一个标准的退出状态。 – kojiro

3

你错过;秒。如果你把它们都放在一个行的一般语法是:

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

thing可以几乎任何返回退出代码。如果thing返回0,则采用then分支,否则采用else分支。

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

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

if ssh [email protected] test -e "$file" ; then ... ; else ... ; fi 
+1

它甚至不应该是'if [',而只是'如果ssh ...'。 –

+0

相当正确的是,没有将它们连接在一起看着这两个问题。 – Mat

30

除了上述问题的答案,有速记的方式来做到这一点:

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

+4

+1,但是这假定接收主机有bash,并且它是用户的默认shell。 – kojiro

+1

我真的很喜欢你的解决方案。只是像我这样的一些新生if-else version:if ssh -q $ {HOST} [[-f $ {FILE_PATH}]];然后回显“文件存在”;否则“找不到文件”; fi – yatsa

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

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

ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH" 
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 
17

无法获得简单得多比这个:)

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

嗯,是的,你可以换出'[$? -eq 0]''ssh'命令本身:) – dimo414

+2

其实我发现你的解决方案是所有建议想法中最好的一个! – GhostCat

4

一条线,适当引用

ssh remote_host test -f "/path/to/file" && echo found || echo not found 
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 
} 
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重定向(如顶部答案)以及围绕命令在远程运行的引号。如果文件存在

1

测试:

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 
相关问题