【问题标题】:Run command as root within shell script在 shell 脚本中以 root 身份运行命令
【发布时间】:2015-10-22 23:45:25
【问题描述】:

我正在编写一个脚本,该脚本将粉碎 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 命令,但是一旦我这样做了,以下所有命令都会被跳过。

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

附注,我没有为这个问题制作一个通用的表格,因为我希望其他人能够在他们喜欢的情况下使用它。

【问题讨论】:

    标签: linux shell root


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多