Баш для пользователя. Лучший в том же или отдельном скрипте?

Я работаю над сценарием Linux Bash, который должен начинаться с root. В конце скрипта он создает список пакетов. Это требует работы как пользователя. Затем он переместит пакеты, которые нужно запустить с правами root. Я настроил sudo, но хочу, чтобы сценарий был как можно более общим.

Я попробовал следующие и небольшие варианты этого в первом скрипте для перехода от root к пользователю.

su -c - "$USER" "export PKGDEST=/tmp/test/AUR/" su -c - "$USER" "pacaur --noconfirm --noedit -cm" "$(< /tmp/test/aur)" 

Вторая строка не работает должным образом, что приводит к различным ошибкам, в зависимости от комбинации котировок и размещения. Запуск строк в первом скрипте, как показано выше, вызвал следующую ошибку после прочтения файла / tmp / test / aur :: без указанных целей (используйте -h для справки). Мое предпочтение было бы заставить этот метод одиночного сценария работать правильно.

Google и т. Д. Сказал, что root, user, root в bash плох, поэтому попробуйте разбить его на 3 части:

  1. Первый скрипт выполняется как root. Проблемные центры здесь не могут заставить его начать второй.
  2. Второй скрипт работает как пользователь, запускает третий скрипт с правами root: sudo / bin / bash «$ L» /copyaur.sh
  3. Третий сценарий, экземпляр copyaur.sh, правильно перемещает пакеты, но не отображается как работает в терминале, потому что вызывает новую оболочку?

Ниже было выполнено как su в пользовательском терминале во время тестирования. Предпочитайте использовать $ USER var в скрипте.

Как su в терминале, затем обратно в su - $USER , тогда ls в домашних списках содержит мое обычное имя пользователя [dom].

 [dom@arch testing]$ echo $USER dom [root@arch testing]# echo $USER dom [root@arch testing]# pwd /home/dom/scripts/testing 

Я получаю следующие результаты при тестировании, начиная с su в терминале. Хотите получить $ USER var для работы вместо dom.

 su - $USER home/$USER/scripts/testing/buildaur.sh - No such file or directory su --login $USER home/$USER/scripts/testing/buildaur.sh - No such file or directory su - $USER home/dom/scripts/testing/buildaur.sh - No such file or directory su - "$USER" home/dom/scripts/testing/buildaur.sh - No such file or directory su - "$USER" ./buildaur.sh - No such file or directory su - dom ./buildaur.sh - No such file or directory su - dom ~/scripts/testing/buildaur.sh - Permission denied su - $USER ~/scripts/testing/buildaur.sh - Permission denied su --login dom ~/scripts/testing/buildaur.sh - Permission denied su - dom /home/dom/scripts/testing/buildaur.sh - Runs as user, expected su --login dom /home/dom/scripts/testing/buildaur.sh - Runs as user, expected su - dom /home/$USER/scripts/testing/buildaur.sh - Runs as user, expected 

9/19/2014 РЕДАКТИРОВАТЬ ДОБАВИТЬ ЗАПРОСУ

Вот часть скрипта. Все еще нет решения. Этот последний вариант сделал это путем создания первого пакета из списка перед сбоем. Однако он выполняет следующую строку, которая является последней командой в скрипте. Имейте в виду, что эта команда отлично работает за пределами использования ее с продолжением su -c - "$USER" "pacaur --noconfirm --noedit -cm $(< /tmp/makeiso/aur)"

 #!/bin/bash ## makeiso.sh must be run as root within /home/"$USER"/makeiso/releng ## makeiso dependancies: archiso pacaur ############################################################################# # Accessing an empty variable will yield an error set -u # Check if root # Print message to user echo "Checking if we're running as root" if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" 1>&2 exit 1 fi # echo for a space echo "" # If passed root test, send message print message to user if [[ $EUID = 0 ]]; then echo "Passed root test, proceeding" fi ################################################## ################################################## Line 180 of the script running as root....... ################################################## # Print message to user echo "Copying system configuration files" set -x # Create directory for following command mkdir -p /tmp/makeiso/ # Create a list of modified config files pacman -Qii | awk '/^MODIFIED/ {print $2}' >> /tmp/makeiso/rtmodconfig.list # Create destination directory for the following command mkdir -p "$L"/airootfs/makeiso/configs/rootconfigs # Copy above list to releng for later use cp /tmp/makeiso/rtmodconfig.list "$L"/airootfs/makeiso/configs/rootconfigs/rtmodconfig.list # Read rtmodconfig.list and copy the modified config files to releng xargs -a /tmp/makeiso/rtmodconfig.list cp -t "$L"/airootfs/makeiso/configs/rootconfigs/ # Set makepkg variable to define where to send built packages su -c - "$USER" "export PKGDEST=/tmp/makeiso/AUR" # Build AUR packages from list, /tmp/makepkg/aur ############# su -c - "$USER" "pacaur --noconfirm --noedit -cm $(< /tmp/makeiso/aur)" ############# # Copy the prebuilt AUR packages to releng cp -R /tmp/makeiso/AUR "$L"/airootfs/makeiso/packages/AUR 

Вот результат с установкой -x. Я использую pacaur для сборки пакетов, которые используют cower и makepkg. Кажется, что либо pacaur, либо makepkg теряют путь к файлу со списком создаваемых пакетов и не распознают имена пакетов в качестве команд.

 + su -c - dom 'export PKGDEST=/tmp/makeiso/AUR' + su -c - dom 'pacaur --noconfirm --noedit -cm bootinfoscript cairo-ubuntu cower fontconfig-ubuntu freetype2-ubuntu gnome-colors-icon-theme gnome-colors-icon-theme-extras gnome-icon-theme-xfce google-chrome grub-legacy libxfcegui4 pacaur package-query pkgbrowser ttf-ms-fonts virtualbox-ext-oracle vivaldi xfce4-quicklauncher-plugin' :: resolving dependencies... :: looking for inter-conflicts... AUR Packages (1): bootinfoscript-0.61-1 :: Retrieving package(s)... sudo: no tty present and no askpass program specified :: Checking bootinfoscript integrity... ==> Making package: bootinfoscript 0.61-1 (Sat Sep 19 22:27:37 PDT 2015) ==> Retrieving sources... -> Found bootinfoscript-061.tar.gz ==> Validating source files with md5sums... bootinfoscript-061.tar.gz ... Passed :: Building bootinfoscript package(s)... ==> Making package: bootinfoscript 0.61-1 (Sat Sep 19 22:27:38 PDT 2015) ==> Checking runtime dependencies... ==> Checking buildtime dependencies... ==> Retrieving sources... -> Found bootinfoscript-061.tar.gz ==> Validating source files with md5sums... bootinfoscript-061.tar.gz ... Passed ==> Extracting sources... -> Extracting bootinfoscript-061.tar.gz with bsdtar ==> Removing existing $pkgdir/ directory... ==> Entering fakeroot environment... ==> Starting package()... ==> Tidying install... -> Purging unwanted files... -> Removing libtool files... -> Removing static library files... -> Compressing man and info pages... -> Stripping unneeded symbols from binaries and libraries... ==> Creating package "bootinfoscript"... -> Generating .PKGINFO file... -> Generating .MTREE file... -> Compressing package... ==> Leaving fakeroot environment. ==> Finished making: bootinfoscript 0.61-1 (Sat Sep 19 22:27:38 PDT 2015) :: bootinfoscript cleaning skipped bash: line 1: cairo-ubuntu: command not found error: no operation specified (use -h for help) bash: line 3: fontconfig-ubuntu: command not found bash: line 4: freetype2-ubuntu: command not found bash: line 5: gnome-colors-icon-theme: command not found bash: line 6: gnome-colors-icon-theme-extras: command not found bash: line 7: gnome-icon-theme-xfce: command not found bash: line 8: google-chrome: command not found bash: line 9: grub-legacy: command not found bash: line 10: libxfcegui4: command not found error: no operation specified (use -h for help) bash: line 14: ttf-ms-fonts: command not found bash: line 15: virtualbox-ext-oracle: command not found bash: line 16: vivaldi: command not found bash: line 17: xfce4-quicklauncher-plugin: command not found + cp -R /tmp/makeiso/AUR /home/dom/makeiso/releng/airootfs/makeiso/packages/AUR 

One Solution collect form web for “Баш для пользователя. Лучший в том же или отдельном скрипте?”

Следующее работало по мере необходимости в моем скрипте для переключения с root на $ USER, а затем обратно в root.

 sudo -u "$USER" bash << HereTag command command command # End Here Tag HereTag 

Чтобы просмотреть, я запускаю скрипт следующим образом:

 [user@linuxbox ~]$ su Password: [root@linuxbox user]# ./script.sh 

После $ su, echo $USER показывает мое имя пользователя. Несмотря на то, что я запускаю скрипт как root, мне предлагается пароль @ sudo -u "$USER" bash .

Я в группе колес, требующих предоставить пароль в файле suoders.

Я бы хотел в конце концов выяснить, как это сделать без необходимости в sudo, но пока это будет работать.

  • Как получить сигнал / сообщение об ошибке в сценарии?
  • Как заполнить файл потоком из / dev / urandom с указанным числом строк?
  • Можно ли сохранять ssh-соединение в bash-скрипте вместо $ (ssh user @ ip command) каждый раз?
  • Почему мой вызов функции не работает при возврате логического?
  • `tcsh` повторить с подоболочкой
  • Как создать выход в скрипт python, запущенный при загрузке?
  • Как запустить скрипт для получения определенного содержимого файла
  • переименование файлов путем добавления месяца и года, определенных в отметках времени файла
  • Добавить определенные слова в файл
  • Почему это пока не работает в Ubuntu?
  • Сортировка каталогов и файлов в каждом каталоге в порядке возрастания и экспорт данных в csv
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.