如何在 shell 脚本中使用 sudo -i

如何在 shell 脚本中使用 sudo -i

可以sudo -i在shell脚本中使用吗?我认为该exit命令会遇到问题......

#!/bin/bash

sudo -i
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit

答案1

已经测试过了!...查看curl命令是如何修改的...

#!/bin/bash

sudo -u root curl -L "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo -u root chmod +x /usr/local/bin/docker-compose
exit

答案2

你不能sudo这样使用。该脚本将为您提供一个交互式 root shell 并暂停,直到您退出该 shell。然后它将在没有特权的情况下运行脚本中的其余命令root

如果你的脚本仅有的执行需要root特权的操作,然后使用以下命令运行整个脚本sudo

$ sudo ./myscript.sh

该脚本看起来像

#!/bin/bash
curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

(注意:我实际上并没有查看这些命令的实际用途)

否则,这只是个人意见,将root脚本中的各个部分分开并将它们放入自己的脚本中可能是个好主意,至少如果是常见任务的话。

#!/bin/bash

# script that does things as an ordinary user
# ...

sudo "$HOME/admin_tasks/do_docker_stuff.sudo"

# rest of script
# ...

或者,您可以做其他人似乎正在做的事情,并在脚本中的每一行前面加上sudo.在这种情况下,它会失败,因为第一行有一个需要root特权的重定向,所以你通过使用来“修复它” sudo bash -c " ... > ... ",将漂亮且可读的脚本变成一团混乱(再次,只是个人意见)。

想了想之后:这不是一个很长的脚本,因此sudo在脚本中进行多次调用可能不是一个坏主意,但我们可以将调用留curl在外部sudo

#!/bin/bash

curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

chmod a+x ./docker-compose

sudo mv ./docker-compose /usr/local/bin/docker-compose
sudo chown root:root /usr/local/bin/docker-compose

最后三个命令可以放入do_local-bin_install.sudo脚本中(供其他脚本重用):

#!/bin/bash

binary="$1"

chmod a+x "$binary"
chown root:root "$binary"
mv -i "$binary" /usr/local/bin/

我们可以从脚本中调用它:

#!/bin/bash
curl -L -o ./docker-compose "https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-$(uname -s)-$(uname -m)"

sudo ./do_local-bin_install.sudo ./docker-compose

抱歉,这是一种意识流类型的答案。我希望有人觉得它可以理解。

相关内容