我正在开发一个脚本,它会破坏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命令,但是一旦我这样做,就会跳过以下所有命令。
如果建议的解决方案要求我输入密码,这没关系。我不希望密码存储在脚本中,这只是无懈可击。
旁注,我没有为这个问题制作一个通用表格,因为我希望其他人能够使用它,如果他们喜欢的话。
答案 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
。