スクリプトにsudoコマンドと非sudoコマンドの両方がある場合は、端末でスクリプトのすべての行のstdoutとstderrを確認してください。

スクリプトにsudoコマンドと非sudoコマンドの両方がある場合は、端末でスクリプトのすべての行のstdoutとstderrを確認してください。

sudoで次のスクリプトを実行しています。

#!/bin/bash

whoami
echo $USER ~
sudo -u blueray bash <<"DOF"
whoami
echo $USER ~
DOF

echo "Running script as user $(whoami)"
sudo -u blueray echo "Running script as user $(whoami)"
sudo -u blueray bash -c 'echo "Running script as user $(whoami)"'

次のような結果が得られた。

% sudo bash test.sh 2>&1 | tee --append /tmp/log.txt
root
root /root
blueray
blueray /home/blueray
Running script as user root
Running script as user root
Running script as user blueray

私の問題は、sudoコマンドとsudo以外のコマンドの両方を含むスクリプトを実行しようとしていることです。

これ提案sudo -u username commandスクリプトでこの行を使用すると、指定されたユーザーとして実行されます。しかし、私の研究結果はそうではないことを示唆しています。sudo -u blueray bash -c私の場合にのみ機能します。ただし、サブシェルはbash -c異なる動作をします。

% var=value
% bash -c 'echo $var'
% (echo $var)
value

だから、これが私が本当に欲しいものであることを理解しないでください。

また、スクリプトを並列ではなく順次実行したいと思います。sudo -u blueray bash -c他のシェルを開いて並列に実行できるかどうかはわかりません。

全体的に私は欲しい端末でスクリプト内のすべての行のstdoutとstderrを表示する。欲しい特定の行を除き、sudoでスクリプトを実行します。。欲しい並列ではなく順次スクリプトを実行する

私のスクリプトは次のとおりです

#!/bin/bash

apt update
apt upgrade -y
apt install -y git zsh zsh-autosuggestions zsh-syntax-highlighting python3 python-is-python3 python3-pip mdadm
chsh -s $(which zsh)

mdadm --assemble --scan

tee -a /etc/fstab << END
LABEL=8TBRaid0 /media/blueray/8TBRaid0  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
LABEL=WDPurple8TB /media/blueray/WDPurple8TB  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
LABEL=WDPurple6TB /media/blueray/WDPurple6TB  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
END

curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main"| tee /etc/apt/sources.list.d/brave-browser-release.list

add-apt-repository -y ppa:christian-boxdoerfer/fsearch-stable

apt update
apt upgrade -y

apt install -y foliate brave-browser

curl -sSL https://get.docker.com/rootless | sh
systemctl --user start docker.service
systemctl --user enable docker.service
loginctl enable-linger blueray

wget -O firefox.tar.bz2 "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=en-US"
tar xjf firefox.tar.bz2
apt remove firefox
mv firefox/ /opt/firefox
rm firefox.tar.bz2
ln -s /opt/firefox/firefox /usr/bin/firefox
desktop-file-install /media/blueray/WDPurple6TB/_Working/_NotesFiltered/linux-mint/supporting-files/Firefox.desktop

pip install yapf

答え1

出力を間違って解釈していますが、わかりやすいですが混乱しています。具体的には、次の行は次のとおりです。

sudo -u blueray echo "Running script as user $(whoami)"

これはechouserとして実行されますが、bluerayコマンドのすべての内容はechoが開始される前に拡張されます。これがシェルがどのように機能するかです。これがecho $var文字列の代わりに変数値が印刷される理由です$var。つまり、上記のコマンドを実行すると、次のことが起こります。

  1. シェルは$(whoami)コマンドの出力に展開されますwhoamiroot
  2. シェル呼び出しはecho拡張値を渡します。

だから実際に実行するのは

sudo -u blueray echo "Running script as user root"

期待される動作を得るには、一重引用符が拡張を防止するため、二重引用符の代わりに一重引用符を使用して新しいシェルを呼び出してコマンドを実行するように指示する必要があります。

sudo -u blueray bash -c 'echo "Running script as user $(whoami)"'

表示するには:

$ sudo -u bib echo "Running script as user $(whoami)"
Running script as user terdon

$ sudo -u bib sh -c 'echo "Running script as user $(whoami)"'
Running script as user bib

したがって、別のユーザーで特定のコマンドを実行したい場合は、はい、実行する方法は次のとおりです。whoamiあなたを混乱させるのは単なる出力です。

関連情報