Bash root para o usuário. Melhor no mesmo script ou separado?

2

Estou trabalhando em um script Linux Bash que precisa ser iniciado como root. No final do script, ele cria uma lista de pacotes. Isso requer a execução como usuário. Em seguida, ele moverá os pacotes, que precisam ser executados como root novamente. Eu tenho o sudo configurado, mas quero manter o script o mais genérico possível.

Eu tentei o seguinte e pequenas variações no primeiro script para alternar de raiz para usuário.

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

A segunda linha não é executada corretamente, resultando em erros diferentes, dependendo da combinação e da colocação da cotação. Executar as linhas dentro do primeiro script, como mostrado acima, produziu o seguinte erro depois de ler o arquivo / tmp / test / aur :: no targets especificado (use -h para ajuda). Minha preferência seria fazer com que esse método de script único funcionasse corretamente.

Google, etc. disse root, user, root no bash é ruim, então tente dividi-lo em 3 partes:

  1. O primeiro script é executado como root. O problema se concentra aqui, não pode ficar para começar o segundo.
  2. O segundo script é executado como usuário, inicia o terceiro script como raiz com: sudo / bin / bash "$ L" /copyaur.sh
  3. Terceiro script, copyaur.sh é executado, movendo os pacotes corretamente, mas não aparece como rodando no terminal porque chama novo shell?

Abaixo foi executado como su em um terminal de usuário durante o teste. Prefira usar o $ USER var no script.

Como su no terminal, volte para su - $USER e, em seguida, ls na home listar o conteúdo do meu nome de usuário normal [dom's].

[dom@arch testing]$ echo $USER
dom

[root@arch testing]# echo $USER
dom

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

Eu obtenho os seguintes resultados em testes, começando como su no terminal. Quer receber $ USER var para funcionar no lugar de 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

19/9/2014 EDITAR PARA ADICIONAR INFORMAÇÕES SOLICITADAS

Aqui está parte do roteiro. Ainda sem solução. Esta última variação conseguiu construir o primeiro pacote da lista antes de falhar. No entanto, conclui a próxima linha, que é o último comando no script. Tenha em mente que este comando funciona bem fora de usá-lo com o processo 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

Aqui está a saída com set -x. Estou usando o pacaur para construir os pacotes, que usam cower e makepkg. Parece que o pacaur ou o makepkg está perdendo o controle do arquivo com a lista de pacotes a serem construídos, e não reconhece os nomes dos pacotes como comandos.

+ 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
    
por Dom 17.09.2015 / 23:44

1 resposta

0

O seguinte funcionou conforme necessário no meu script para alternar do root para o $ USER e, em seguida, para o root.

sudo -u "$USER" bash << HereTag

command
command
command

# End Here Tag 
HereTag 

Para revisar, estou iniciando o script assim:

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

Depois de $ su, echo $USER mostra meu nome de usuário. Mesmo que eu esteja iniciando o script como root, eu solicito uma senha @ sudo -u "$USER" bash .

Eu estou no grupo wheel precisando fornecer a senha no arquivo de suoders.

Eu gostaria de descobrir como fazer isso sem a necessidade de sudo, mas isso vai funcionar por enquanto.

    
por 25.09.2015 / 10:44