我想检查远程主机上是否存在某个文件。 我试过这个:
$ 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")
答案 0 :(得分:40)
除上述答案外,还有简便的方法:
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist";
-q
是安静模式,它会禁止警告和消息。
正如@Mat所提到的,这样的测试的一个优点是,您可以轻松地为您喜欢的任何测试操作符换出-f
:-nt
,-d
,{{1}等等......
答案 1 :(得分:34)
这是一个简单的方法:
if ssh $HOST stat $FILE_PATH \> /dev/null 2\>\&1
then
echo "File exists"
else
echo "File does not exist"
fi
答案 2 :(得分:21)
不能比这简单得多:)
ssh host "test -e /path/to/file"
if [ $? -eq 0 ]; then
# your file exists
fi
答案 3 :(得分:8)
一行,正确引用
ABORTED
答案 4 :(得分:6)
你错过了;
。如果将所有内容放在一行中,则通用语法为:
if thing ; then ... ; else ... ; fi
thing
几乎可以返回退出代码。如果then
返回0,则采用thing
分支,否则采用else
分支。
[
不是语法,而是test
程序(查看ls /bin/[
,它实际存在,man test
用于文档 - 虽然也可以有内置的在具有不同/附加功能的版本中。)用于测试文件和变量的各种常见条件。 (另请注意,[[
是语法,如果它支持,则由shell处理。
对于您的情况,您不希望直接使用test
,而是想要在远程主机上测试某些内容。所以尝试类似的事情:
if ssh user@host test -e "$file" ; then ... ; else ... ; fi
答案 5 :(得分:3)
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"
上面将在你运行ssh命令的机器上运行echo命令。要使远程服务器运行命令:
ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
答案 6 :(得分: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
答案 7 :(得分: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
答案 8 :(得分: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
}
答案 9 :(得分: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重定向(作为最佳答案)以及要在远程运行的命令周围的引号。
答案 10 :(得分:-1)
这也可以:
if ssh user@ip "[ -s /path/file_name ]" ;then
status=RECEIVED ;
else
status=MISSING ;
fi
答案 11 :(得分:-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