Ответ 1
Ответы на этот вопрос повсюду. Ниже приведен простой подход.if ssh $HOST stat $FILE_PATH \> /dev/null 2\>\&1
then
echo "File exists"
else
echo "File does not exist"
fi
Я хотел бы проверить, существует ли определенный файл на удаленном хосте. Я пробовал это:
$ 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")
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
для docs – хотя может также иметь встроенную версию с различными/дополнительными функциями.), который используется для проверки различных общих условий на файлы и переменные. (Обратите внимание, что [[
, с другой стороны, является синтаксисом и обрабатывается вашей оболочкой, если он ее поддерживает).
В вашем случае вы не хотите использовать test
напрямую, вы хотите что-то проверить на удаленном хосте. Поэтому попробуйте что-то вроде:
if ssh [email protected] test -e "$file" ; then ... ; else ... ; fi
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"
Вышеупомянутая команда запускает команду echo на компьютере, на котором выполняется команда ssh. Чтобы заставить удаленный сервер выполнить команду:
ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
Вы можете указать оболочку, которая будет использоваться удаленным хостом локально.
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 работающий для меня oneliner bash был:
if ssh <servername> "stat <filename> > /dev/null 2>&1"; then echo "file exists"; else echo "file doesnt exits"; fi
Ему понадобилось перенаправление ввода-вывода (как верхний ответ), а также кавычки вокруг команды, которая будет запущена на удаленном компьютере.