Как проверить, проверяется ли файл на удаленном сервере с помощью ssh и оператора if

Вам необходимо правильно установить переменную LANG.

Если вы хотите изменить язык только для mutt, вы можете запустить команду, например:

LANG=en_US.UTF-8 mutt
2
08.08.2019, 10:54
2 ответа

Как объяснил pLumo , ваш тест всегда будет успешным.

Что вам нужно сделать, так это проверить, расширяется ли ваш паттерн $SSHPATH/$ID.*во что-то. Это отличается от проверки с помощью -f, является ли это обычным файлом, поскольку шаблон может расширяться до нескольких имен, а проверка -fможет применяться только к одному пути.

Локально это можно сделать с помощью

set -- "$SSHPATH/$ID".*
if [ -e "$1" ]; then...; fi

Это установит позиционные параметры ($1, $2и т. д. )на имена, соответствующие шаблону, указанному в set. Операторы ifзатем проверяют, является ли первое совпадение существующим именем (шаблон останется нераскрытым в большинстве оболочек, если он ничему не соответствует ).

Чтобы выполнить это черезssh:

ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"

Нечеткие кавычки гарантируют, что $SSHPATHи $IDрасширяются локальной оболочкой , а "$1"расширяются удаленно.

Это даст вам нулевой статус выхода ("успешно" ), если шаблон соответствует существующему имени, и не -нулевой ("неудачный" ), если нет (. ] или если sshкаким-то образом не удалось ).

Вы можете использовать это в операторе ifследующим образом:

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"; then
   # do something for success
else
   # do something for failure
fi

Чтобы проверить отсутствие-существования, отмените тест:

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ ! -e \"\$1\" ]"; then
   # do something for failure
else
   # do something for success
fi

Я проигнорировал использование вами sshpass, но вы можете просто добавить префикс sshс ним, как вы сделали в вопросе.

3
27.01.2020, 21:58

Ваша первая команда аналогична

if [ "some string" ]; then... fi

что всегда будет верно.

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

Двойные кавычки всей команды и одинарные кавычки пути, чтобы избежать проблем со специальными символами внутри пути. Убедитесь, что *находится вне одинарных кавычек :

.
if sshpass -p "$SSHPASS" ssh root@$SSHHOST "test ! -f '$SSHPATH/$ID.'*"; then... fi

Если ваш шаблон соответствует нескольким файлам, тест завершится неудачно .

1
27.01.2020, 21:58

Теги

Похожие вопросы