在shell脚本中以root身份运行命令

时间:2015-10-22 23:45:26

标签: linux shell root

我正在开发一个脚本,它会破坏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命令,但是一旦我这样做,就会跳过以下所有命令。

如果建议的解决方案要求我输入密码,这没关系。我不希望密码存储在脚本中,这只是无懈可击。

旁注,我没有为这个问题制作一个通用表格,因为我希望其他人能够使用它,如果他们喜欢的话。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

只有“echo”将通过sudo以root身份运行,但使用>重定向到文件仍将作为“普通”用户执行,因为它不是命令,而是直接由贝壳。

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

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

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