Проверьте, существует ли файл на удаленном хосте с помощью ssh

Я хотел бы проверить, существует ли определенный файл на удаленном хосте. Я попробовал это:

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

13 ответов

Решение

Вот простой подход:

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

fi

В дополнение к ответам выше, есть сокращенный способ сделать это:

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

Не может быть намного проще, чем это:)

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

Одна строка, правильное цитирование

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

Ты пропускаешь ;s. Общий синтаксис, если поместить все это в одну строку:

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

thing может быть почти любым, что возвращает код выхода. then ветка берется если что thing возвращает 0, else ветвь иначе.

[ не синтаксис, это test программа (проверить ls /bin/[действительно существует, man test для документов - хотя также может иметь встроенную версию с различными / дополнительными функциями.), которая используется для проверки различных общих условий для файлов и переменных. (Обратите внимание, что [[ с другой стороны это синтаксис и обрабатывается вашей оболочкой, если она его поддерживает).

Для вашего случая вы не хотите использовать test непосредственно, вы хотите проверить что-то на удаленном хосте. Так что попробуйте что-то вроде:

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

Проверьте, существует ли файл:

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
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"

Приведенное выше запустит команду echo на машине, с которой вы запускаете команду ssh. Чтобы заставить удаленный сервер выполнить команду:

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

Тихая проверка, существует ли файл, и выполнить, если нет

      if ! ssh $USER@$HOST "test -e file.txt" 2> /dev/null; then
  echo "File not exist"
fi

Вы можете указать оболочку, которая будет использоваться удаленным хостом локально.

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

И будьте осторожны (одиночные) заключите в кавычки переменные, которые вы хотите расширить на удаленном хосте; в противном случае расширение переменной будет выполняться вашей локальной оболочкой!

# 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

Я хотел также проверить, существует ли удаленный файл, но с 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
}

На машине CentOS, bash oneliner, который работал для меня, был:

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

Требовалось перенаправление ввода / вывода (в качестве верхнего ответа), а также кавычки вокруг команды, которая будет выполняться на удаленном компьютере.

Это тоже работает:

if ssh user@ip "[ -s /path/file_name ]" ;then 
  status=RECEIVED ; 
 else 
  status=MISSING ; 
 fi
      #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
Другие вопросы по тегам