как запустить скрипт с привилегиями root при загрузке?

Если вы используете 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

-1
30.11.2019, 13:45
2 ответа

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, которую вы передали своему сценарию... что объясняет обнаруженную вами ошибку.

0
28.01.2020, 05:08

Ваш 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.

Здесь у вас есть два варианта:

  1. Переместите файл конфигурации туда, где инструмент ожидает его найти, или
  2. Сообщите инструменту, где находится HOME.

Второй вариант можно выполнить, изменив задание cron, чтобы оно говорило

@reboot sleep 120 && HOME=/home/pat PATH="$PATH:/usr/sbin" /home/pat/Documents/cyberghost/ghoststart.sh
2
28.01.2020, 05:08

Теги

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