Я пытаюсь написать сценарий 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"
Надеюсь, поможет...