Назад | Перейти на главную страницу

sftp возвращает код 0, даже если сообщается об ошибке «Не удалось создать каталог: сбой»

Я пытаюсь написать сценарий Bash, отвечающий за создание папки на удаленном сервере.

Фрагмент:

!/bin/bash -e
echo "Creating remote folder."
echo mkdir test_folder | sftp -oPort=22 192.168.0.11:/tmp
if [[ $? != 0 ]]; then
  echo "Transfer failed!"
  exit 1
else
  echo "Transfer complete."
fi
echo $?

Результат:

Connected to 192.168.0.11.
Changing to: /tmp
sftp> mkdir test_folder
Couldn't create directory: Failure
Transfer complete.
0

Итак, код возврата равен 0, но, очевидно, произошла ошибка.

Как я могу поймать удаленную ошибку и установить соответствующий код возврата в скрипте?

Используйте опцию sftp -b (с помощью пакетного файла или замены процесса bash), и вы получите код возврата mkdir.

sftp -b <(echo "mkdir test_folder") user@remotehost:/
echo $?

Вывод:

Changing to: /
sftp> mkdir test_folder
Couldn't create directory: Failure
1

или используйте это:

echo "mkdir test_folder" | sftp -b - user@remotehost:/
echo ${PIPESTATUS[1]}

От человека sftp:

-b batchfile: Пакетный режим считывает серию команд из входного пакетного файла вместо стандартного ввода. Поскольку в нем отсутствует взаимодействие с пользователем, его следует использовать вместе с неинтерактивной аутентификацией. Пакетный файл «-» может использоваться для обозначения стандартного ввода. sftp прервется, если любая из следующих команд завершится неудачно: get, put, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink и lmkdir. Прерывание в случае ошибки может быть подавлено для каждой команды путем добавления к команде префикса «-» (например, -rm / tmp / blah *).

1) Использование символа $? переменная неверна. Проблема в том, что вам нужно сохранить возвращаемое значение ($?) Сразу после выполнения команды sftp. В противном случае вы получите возвращаемое значение другой команды. Например.:

rm /directory_which/does_not_exists
echo $?
echo "Deleting directory ..."

полностью отличается от:

rm /directory_which/does_not_exists
echo "Deleting directory ..."
echo $?

2) Вы можете создать удаленный каталог, используя ssh, а также

ssh username@192.168.0.11 "cd /tmp && mkdir test_folder"

Надеюсь, поможет...