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"; |
正如@mat所提到的,这种测试的一个优点是,您可以很容易地将
测试操作员: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 |
对于您的情况,您不希望直接使用
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 } |