rootで起動する必要があるLinux Bashスクリプトを開発しています。スクリプトが終了すると、パッケージのリストが作成されます。これはユーザーとして実行する必要があります。次に、rootとして再実行する必要があるパッケージを移動します。 sudoを設定しましたが、スクリプトをできるだけ一般的にしたいと思います。
rootからユーザーに切り替えるために、最初のスクリプトで次のようないくつかのバリエーションを試しました。
su -c - "$USER" "export PKGDEST=/tmp/test/AUR/"
su -c - "$USER" "pacaur --noconfirm --noedit -cm" "$(< /tmp/test/aur)"
2行目は正しく機能しないため、引用の組み合わせと場所によって異なるエラーが発生します。 /tmp/test/aur::no target 指定されたファイルを読み取った後(ヘルプを表示するには -h を使用)、最初のスクリプト(上記)の行を実行すると、次のエラーが発生します。私が好むのは、この単一のスクリプトアプローチが正しく機能することです。
Googleなどでは、bashのルート、ユーザー、ルートが良くないと言うので、これを3つの部分に分けてみてください。
- 最初のスクリプトはrootとして実行されます。問題はここに集中しており、2番目の問題は開始できません。
- 2番目のスクリプトはユーザーとして実行され、3番目のスクリプトはrootで始まります。sudo /bin/bash "$L"/copyaur.sh
- 3番目のスクリプト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
私のユーザー名が表示されます。 rootでスクリプトを起動しても、@パスワードを入力するように求められますsudo -u "$USER" bash
。
私はWheelグループに属しており、suodersファイルにパスワードを提供する必要があります。
結局、sudoなしでこれを行う方法を見つけたいのですが、今はこれがうまくいきます。
答え2
su -c "<command to run as user>" $USER
sudo
これは、スクリプトの終わりにインストールサイクルを完了するためにルートからユーザーに切り替える必要がある自動インストーラを作成するのに効果的でした。
su
このコマンドを使用してSwitch User
。
-c
その後、root以外のユーザーとして実行するように指定するコマンドを使用できます。
$USER
その後、スクリプトを使用して root 以外のユーザーに切り替える必要があることを指定できます。
以下は私に役立つ例です。
su -c "npm install && npm audit fix" $USER
これだけ覚えてください
- rootからユーザー(rootではない)に切り替えるためにbashスクリプトが必要な場合は、次のものを使用できます。
su -c "command here" $USER
- root以外のユーザーからrootに切り替えるためにbashスクリプトが必要な場合は、次のものを使用できます。
su -c "command here" $user