运行 在 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
.
我正在编写一个脚本,它将粉碎 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
.