1

Я пытаюсь запустить скрипт bash от другого с помощью sudo.

Вот мой первый скрипт test.sh

#!/bin/bash
echo "test.sh" $1 $2 $3  >>/home/pi/test.log
sudo ./temp.sh "$1" "$2" "$3" >>/home/pi/test.log &
echo "test.sh done!" >>/home/pi/test.log

Когда я бегу

./test.sh a b c

в моей консоли это работает. Второй скрипт запускается с аргументами! Но когда первый скрипт запускается из других инструментов (плагин Deluge Execute), второй скрипт никогда не запускается. Похоже, проблема с разрешениями.

Обновление: я переименовываю второй скрипт в temp.sh, и он делает эхо во втором файле

#!/bin/bash
torrentid=$1
torrentname=$2
torrentpath=$3

echo " Details: " $torrentid $torrentpath $torrentname >> /home/pi/temp.log

Он работает при запуске из командной строки, но не Deluge.

Обновление 2: Второй скрипт - это добровольный запуск во второй оболочке /env с &, потому что он будет выполнять длительное действие. Я делаю это потому, что когда скрипт запускается и выполняется с помощью плагина deluge, deluge замораживается во время выполнения. Поэтому мне нужен скрипт, который запускает второй в фоновом режиме.

Обновление 3: мой пользователь pi как уже pi ALL=(ALL) NOPASSWD: ALL в файле visudo

5 ответов5

1

Одна определенная проблема с

sudo ./sort.sh "$1" "$2" "$3" & >>/home/pi/test.log

Вы пытаетесь перенаправить вывод после запуска скрипта в фоновом режиме. Обратите внимание, что & действует также как разделитель команд, поэтому вы, по сути, выполняете следующие две команды:

sudo ./sort.sh "$1" "$2" "$3" &
>>/home/pi/test.log

Вам нужно исправить порядок двух. Сказать:

sudo ./sort.sh "$1" "$2" "$3" >>/home/pi/test.log &

Другая проблема заключается в том, что вы указываете относительный путь для второго скрипта. Либо замените ./temp.sh в скрипте на абсолютный путь, либо добавьте в префикс каталог, содержащий скрипт

"$(dirname "$0")"/temp.sh
1

Попробуй это:

#!/bin/bash
cd "$(dirname "$0")"
# rest of script goes here
# ...
1

Есть две проблемы с вашим кодом BASH:

  1. вы используете sudo, который требует аутентификации, чего Deluge Execute, вероятно, не может сделать (я не знаю Deluge.)
  2. вы используете &, который явно запускает вашу команду в подоболочке с собственным окружением.

Чтобы исправить 1. У вас есть два варианта. Вы можете сделать пользователя Deluge sudoer и ввести пароль в sudo следующим образом: echo $PASSWORD | sudo -S <command> или вы можете создать соответствующее правило в файле sudoers, чтобы пользователь Deluge мог выполнить эту команду без аутентификации. Прочтите man-страницу sudo для получения дополнительной информации.

Чтобы исправить 2. просто удалите символ «&» и подумайте об использовании встроенного source команд. Прочитайте справочную страницу BASH для получения дополнительной информации.

0

Другая проблема заключается в том, что две команды (sudo ./temp.sh "$1" "$2" "$3" и echo "test.sh done!") записывают в один и тот же файл (/home/pi/test.log) одновременно (т. е. одновременно), потому что в temp.sh (если он выполняется) файл открывается в фоновом режиме при выполнении echo .  Это не должно быть серьезной проблемой - это не должно препятствовать temp.sh - но если вы решите основную проблему и запустите temp.sh и запишете вывод, то он, вероятно, перезапишет "test.sh done!"  И наоборот, если temp.sh выполняется достаточно быстро, то echo может перезаписать первые 14 байтов вывода из temp.sh

0

Попробуйте это модифицированные скрипты.
Test.sh

#!/bin/bash
cd "$(dirname "$0")"
echo "test.sh $1 $2 $3"  >>/home/pi/test.log
gksu bash ./temp.sh "$1" "$2" "$3" >> /home/pi/test.log &
echo "test.sh done!" >>/home/pi/test.log

temp.sh

#!/bin/bash
torrentid="$1"
torrentname="$2"
torrentpath="$3"

echo "Details:  $torrentid $torrentpath $torrentname" >> /home/pi/temp.log

Если gksu недоступен, используйте pkexec

Комментарии

gksu - это графический интерфейс sudo . Просто попробуйте sudo gedit и gksu gedit . Sudo удален из более новой версии Ubuntu. Вы пробовали сценарий? Как это ?

2

попробуйте 1: добавьте sleep 15 в конце первого скрипта test.sh.
Попробуйте 2: добавьте nohup перед gksu. Т.е. nohup gksu bash ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .