Если вы используете GNU mv
, вам лучше сделать:
find. -type f -exec mv -t. {} +
С другими mv
с:
find. -type f -exec sh -c 'exec mv "$@".' sh {} +
Ни в коем случае нельзя вставлять {}
в код sh
. Это уязвимость внедрения команд, поскольку имена файлов интерпретируются как шелл-код (попробуйте с файлом с именем `reboot`
, например ).
Хорошая идея заключить подстановку команды в кавычки, но поскольку вы использовали архаичную форму(`...`
вместо $(...)
), вам нужно экранировать внутренние двойные кавычки, иначе это не будет работать в sh
. ] реализации, основанные на оболочке Bourne или AT&T ksh (, где "`basename "foo bar"`"
фактически будет рассматриваться как"`basename "
(с непревзойденным `
, который принимается в этих оболочках ), объединенных с foo
, а затемbar"`"
).
Кроме того, когда вы делаете:
mv foo/bar bar
Если бы bar
действительно существовал и был каталогом, это был бы mv foo/bar bar/bar
. mv -t. foo/bar
или mv foo/bar.
не имеют этой проблемы.
Теперь, чтобы сохранить эти несколько аргументов (-exec
, sh
, -c
, exec mv "$@".
, sh
, {}
,+
)в переменной, вам понадобится переменная-массив. Оболочки, поддерживающие массивы: (t)csh
, ksh
,bash
, zsh
, rc
, es
, yash
, fish
.
И чтобы иметь возможность использовать эту переменную просто как $FLATTEN
(, а не "${FLATTEN[@]}"
в ksh/bash/yash или $FLATTEN:q
в (t)csh
), вам понадобится оболочка с разумной реализацией массива :rc
. ], es
или fish
. Также zsh
здесь, как это бывает, ни один из этих аргументов не является пустым.
В rc
/ es
/zsh
:
FLATTEN=(-exec sh -c 'exec mv "$@".' sh '{}' +)
Вfish
:
set FLATTEN -exec sh -c 'exec mv "$@".' sh '{}' +
Затем вы можете использовать:
find. -type f $FLATTEN
root@mrpotato:/var/spool/cron/crontabs# /bin/sh -c "(export PATH=/usr/bin:/bin;/home/pat/Documents/cyberghost/ghoststart.sh
Где находится ваш бинарный файл openvpn? В моем Debian он находится в /usr/sbin
, который не является частью переменной PATH, которую вы передали своему сценарию... что объясняет обнаруженную вами ошибку.
Ваш ghoststart.sh
скрипт (или что-то cyberghostvpn
внутри него )пытается запустить OpenVPN, вызывая исполняемый файл openvpn
. Этот исполняемый файл не находится в $PATH
скрипта. Используйте command -v openvpn
в терминале, чтобы найти путь к исполняемому файлу.
Если ваш исполняемый файл openvpn
находится в /usr/sbin
, вы можете написать расписание crontab как
@reboot sleep 120 && PATH="$PATH:/usr/sbin" /home/pat/Documents/cyberghost/ghoststart.sh
Ваше «третье редактирование» также указывает на то, что инструмент ищет файл конфигурации в домашнем каталоге пользователя, запускающего инструмент. Вы говорите, что этот файл находится в домашнем каталоге pat
, а не в домашнем каталоге root
.
Здесь у вас есть два варианта:
HOME
. Второй вариант можно выполнить, изменив задание cron, чтобы оно говорило
@reboot sleep 120 && HOME=/home/pat PATH="$PATH:/usr/sbin" /home/pat/Documents/cyberghost/ghoststart.sh