![当脚本同时具有 sudo 和非 sudo 命令时,在终端中查看脚本所有行的 stdout 和 stderr](https://linux22.com/image/199536/%E5%BD%93%E8%84%9A%E6%9C%AC%E5%90%8C%E6%97%B6%E5%85%B7%E6%9C%89%20sudo%20%E5%92%8C%E9%9D%9E%20sudo%20%E5%91%BD%E4%BB%A4%E6%97%B6%EF%BC%8C%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%9F%A5%E7%9C%8B%E8%84%9A%E6%9C%AC%E6%89%80%E6%9C%89%E8%A1%8C%E7%9A%84%20stdout%20%E5%92%8C%20stderr.png)
我正在以 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
适用。但 subshell 的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)"
这将以echo
用户身份运行blueray
,但是,命令中的所有内容都会在启动 echo 之前展开。这就是 shell 的工作原理,这就是为什么echo $var
将打印变量的值而不仅仅是字符串$var
。换句话说,当您运行上面的命令时,会发生什么:
- shell 扩展
$(whoami)
为命令的输出whoami
,即root
. - shell 调用
echo
将扩展值传递给它。
所以你实际运行的是
sudo -u blueray echo "Running script as user root"
为了获得您期望的行为,您需要调用一个新的 shell 并告诉它运行命令,使用单引号而不是双引号,因为单引号会阻止扩展:
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
它的输出让你感到困惑。