루트로 시작해야 하는 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개 부분으로 나누어 보십시오.
- 첫 번째 스크립트는 루트로 실행됩니다. 문제는 여기에 집중되어 있으며 두 번째 문제는 시작할 수 없습니다.
- 두 번째 스크립트는 사용자로 실행되고 세 번째 스크립트는 루트로 시작됩니다: sudo /bin/bash "$L"/copyaur.sh
- 세 번째 스크립트인 copyaur.sh가 실행되어 패키지를 올바르게 이동하지만 새 셸이 호출되기 때문에 터미널에서 실행 중인 것으로 표시되지 않습니다.
테스트 중 사용자 터미널에서 su로 실행한 내용은 다음과 같습니다. 스크립트에서는 $USER var를 사용하는 것이 좋습니다.
터미널에 su를 입력한 다음 로 돌아가서 su - $USER
집 ls
에 있는 내 일반 사용자 이름 [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