我正在开发一个需要以 root 身份启动的 Linux Bash 脚本。在脚本的末尾,它会构建一个包列表。这需要以用户身份运行。然后它将移动软件包,这需要再次以 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等说bash中的root、user、root不好,所以尝试将其分成3部分:
- 第一个脚本以 root 身份运行。问题集中在这里,无法启动第二个。
- 第二个脚本以用户身份运行,以 root 身份启动第三个脚本: sudo /bin/bash "$L"/copyaur.sh
- 第三个脚本 copyaur.sh 运行,正确移动软件包,但由于调用新 shell 而未在终端中显示为正在运行?
下面是在测试期间在用户终端中作为 su 运行的。更喜欢在脚本中使用 $USER var。
在终端中输入 su,然后返回到su - $USER
,然后 ls
在 home 中列出我的普通用户名 [dom's] 内容。
[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
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 的输出。我使用 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
答案1
以下内容根据我的脚本中的需要从 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
。
我在 Wheel 组中,需要在 suoders 文件中提供密码。
我想最终弄清楚如何在不需要 sudo 的情况下完成此任务,但这暂时有效。
答案2
su -c "<command to run as user>" $USER
当创建一个需要执行的自动安装程序时,这对我有用sudo
,在我的脚本结束时,它需要从 root 切换到用户才能完成其安装周期
您将使用该su
命令来Switch User
.
然后您可以使用-c
指定以非 root 用户身份运行的命令。
然后您可以使用$USER
该脚本来指定您需要切换到非 root 用户。
下面是对我有用的一个例子。
su -c "npm install && npm audit fix" $USER
只要记住这一点
- 如果您需要 bash 脚本从 root 切换到用户(非 root),您可以使用
su -c "command here" $USER
- 如果您需要 bash 脚本从用户(非 root)切换到 root,您可以使用
su -c "command here" $user