运行 在 shell 脚本中作为 root 命令

Run command as root within shell script

我正在编写一个脚本,它将粉碎 USB 驱动器并使用加密的持久数据安装 Kali linux。

#! /bin/bash

cd ~/Documents/Other/ISOs/Kali
echo "/dev/sdx x=?"
read x
echo "how many passes to wipe? 1 will be sufficient."
read n
echo "sd$x will be wiped $n times."
read -p "do you want to continue? [y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
        exit 1
fi

echo "Your role in the installation process is not over. You will be prompted to type YES and a passphrase."

sudo shred -vz --iterations=$n /dev/sd$x

echo "Wiped. Installing Kali"
sudo dd if=kali-linux-2.0-amd64.iso of=/dev/sd$x bs=512k

echo "Installed. Making persistence."

y=3

sudo parted /dev/sd$x mkpart primary 3.5GiB 100%
x=$x$y
sudo cryptsetup --verbose --verify-passphrase luksFormat /dev/sd$x
sudo cryptsetup luksOpen /dev/sd$x my_usb
sudo mkfs.ext3 -L persistence /dev/mapper/my_usb
sudo e2label /dev/mapper/my_usb persistence

sudo mkdir -p /mnt/my_usb
sudo mount /dev/mapper/my_usb /mnt/my_usb
sudo -i
echo "/ union" > /mnt/my_usb/persistence.conf
umount /dev/mapper/my_usb

cryptsetup luksClose /dev/mapper/my_usb

echo "Persistence complete. Installation complete."

它几乎完美地工作。将这些命令单独输入终端会产生预期的效果,但问题出在第 37 行:

sudo echo "/ union" > /mnt/my_usb/persistence.conf

除非我以 root 用户身份登录,否则该命令将不起作用。为了解决这个问题,我之前尝试添加 sudo -i 命令,但是一旦我这样做,以下所有命令都会被跳过。

如果建议的解决方案要求我输入密码也没关系。我不想将密码存储在脚本中,这太鲁莽了。

旁注,我没有为这个问题制作通用表格,因为我希望其他人如果喜欢也可以使用它。

问题是 echo 以 root 权限运行,但重定向发生在原始 shell 中作为非 root 用户。相反,在 sudo 下尝试 运行 显式 sh 并在那里进行重定向

sudo /bin/sh -c 'echo "/ union" > /mnt/my_usb/persistence.conf'

问题是当您输入以下命令时:

sudo echo "/ union" > /mnt/my_usb/persistence.conf

只有 "echo" 将通过 sudo 以 root 身份 运行,但使用 > 重定向到文件仍将作为 "normal" 用户执行,因为它不是命令,而是 shell.

直接执行的操作

我通常的解决方案是使用 tee 以便它 运行 作为命令而不是作为 shell 内置操作,像这样:

echo "/ union" | sudo tee /mnt/my_usb/persistence.conf >/dev/null

现在 tee 命令将以 root 身份通过 sudo 运行 并被允许写入文件。刚刚添加 >/dev/null 是为了保持脚本的输出干净。如果您想要追加而不是覆盖(例如,您通常会使用 >>),则使用 tee -a.