사용자에게 Bash 루트를 제공합니다. 동일하거나 별도의 스크립트를 사용하는 것이 바람직합니까?

사용자에게 Bash 루트를 제공합니다. 동일하거나 별도의 스크립트를 사용하는 것이 바람직합니까?

루트로 시작해야 하는 Linux Bash 스크립트를 개발 중입니다. 스크립트가 끝나면 패키지 목록이 작성됩니다. 이 작업은 사용자로 실행해야 합니다. 그런 다음 루트로 다시 실행해야 하는 패키지를 이동합니다. sudo를 설정했지만 스크립트를 가능한 한 일반적으로 만들고 싶습니다.

루트에서 사용자로 전환하기 위해 첫 번째 스크립트에서 다음과 같은 약간의 변형을 시도했습니다.

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

두 번째 줄은 제대로 작동하지 않아 인용 조합과 위치에 따라 다른 오류가 발생합니다. /tmp/test/aur::no target 지정된 파일을 읽은 후(도움말을 보려면 -h 사용) 첫 번째 스크립트(위에 표시된)의 행을 실행하면 다음 오류가 발생합니다. 제가 선호하는 것은 이 단일 스크립트 접근 방식이 제대로 작동하는 것입니다.

Google 등에서는 bash의 루트, 사용자, 루트가 좋지 않다고 하므로 이를 3개 부분으로 나누어 보십시오.

  1. 첫 번째 스크립트는 루트로 실행됩니다. 문제는 여기에 집중되어 있으며 두 번째 문제는 시작할 수 없습니다.
  2. 두 번째 스크립트는 사용자로 실행되고 세 번째 스크립트는 루트로 시작됩니다: sudo /bin/bash "$L"/copyaur.sh
  3. 세 번째 스크립트인 copyaur.sh가 실행되어 패키지를 올바르게 이동하지만 새 셸이 호출되기 때문에 터미널에서 실행 중인 것으로 표시되지 않습니다.

테스트 중 사용자 터미널에서 su로 실행한 내용은 다음과 같습니다. 스크립트에서는 $USER var를 사용하는 것이 좋습니다.

터미널에 su를 입력한 다음 로 돌아가서 su - $USERls에 있는 내 일반 사용자 이름 [dom's] 항목을 나열합니다.

[dom@arch testing]$ echo $USER
dom

[root@arch testing]# echo $USER
dom

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

터미널에서 su로 시작하여 테스트에서 다음 결과를 얻었습니다. dom 대신 $USER var가 작동하길 원합니다.

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

필수 정보를 추가하기 위해 2014년 9월 19일에 수정됨

이것은 스크립트의 일부입니다. 아직 해결책이 없습니다. 이 최신 변종은 실패하기 전에 목록의 첫 번째 패키지를 성공적으로 빌드했습니다. 그러나 스크립트의 마지막 명령인 다음 줄은 완성됩니다. 이 명령은 후속 조치와 함께 사용되는 것 외에도 잘 작동한다는 점을 명심하십시오.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

이것은 set -x를 사용한 결과입니다. 나는 cower와 makepkg를 사용하는 패키지를 빌드하기 위해 pacaur를 사용합니다. 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

답변1

다음은 내 스크립트에서 필요에 따라 루트에서 $USER로 전환하고 다시 루트로 전환합니다.

sudo -u "$USER" bash << HereTag

command
command
command

# End Here Tag 
HereTag 

요약하자면 다음과 같이 스크립트를 시작했습니다.

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

$ su 뒤에는 echo $USER내 사용자 이름이 표시됩니다. 루트로 스크립트를 시작했는데도 여전히 @ 비밀번호를 입력하라는 메시지가 표시됩니다 sudo -u "$USER" bash.

저는 Wheel 그룹에 속해 있으며 suoders 파일에 비밀번호를 제공해야 합니다.

결국 sudo 없이 이 작업을 수행하는 방법을 알아내고 싶지만 지금은 이 방법이 작동합니다.

답변2

su -c "<command to run as user>" $USER

sudo이는 스크립트가 끝날 때 설치 주기를 완료하기 위해 루트에서 사용자로 전환해야 하는 자동 설치 프로그램을 생성할 때 효과적이었습니다.

su이 명령을 사용하여 Switch User.

-c그런 다음 루트가 아닌 사용자로 실행하도록 지정하는 명령을 사용할 수 있습니다 .

$USER그런 다음 스크립트를 사용하여 루트가 아닌 사용자로 전환해야 함을 지정할 수 있습니다.

다음은 나에게 도움이 된 예입니다.

su -c "npm install && npm audit fix" $USER

이것만 기억하세요

  • 루트에서 사용자(루트가 아닌)로 전환하기 위해 bash 스크립트가 필요한 경우 다음을 사용할 수 있습니다.su -c "command here" $USER
  • 루트가 아닌 사용자에서 루트로 전환하기 위해 bash 스크립트가 필요한 경우 다음을 사용할 수 있습니다.su -c "command here" $user

관련 정보