执行'sudo -i'后bash执行代码停止

时间:2016-07-14 04:00:55

标签: linux bash shell

# !/bin/bash
sudo  -i
cd /etc/apt/sources.list.d
echo "deb http://archive.ubuntu.com/ubuntu/ precise main restricted  universe multiverse" >ia32-libs-precise.list
sudo apt-get update
sudo apt-get install ia32-libs
sudo rm /etc/apt/sources.list.d/ia32-libs-raring.list
sudo  apt-get update

当我执行这个脚本时,它只是做'sudo -i'然后停止,谁可以帮助我?

2 个答案:

答案 0 :(得分:1)

sudo联机帮助页说:

  

-i, - 登录
       将目标用户的密码数据库条目指定的shell作为登录shell运行   。
  。
  。
  如果未指定任何命令,则执行交互式shell。

难怪你的脚本执行停止了。

命令

cd /etc/apt/sources.list.d
.
.
sudo  apt-get update
永远不会到达

,因为您刚刚生成了一个sudo -i的新shell。

在评论中建议[ @mona_sax ],在sudo中运行脚本在安全上下文中可能不是一个好主意。目前尚不清楚您的实际意图是什么,但如果打算在后台运行脚本,则删除sudo -i行并执行:

./script 2>&1 1>/dev/null &

答案 1 :(得分:0)

因为您没有指定以root身份运行的命令,sudo会调用交互式shell。它会在你exit之前终止(或被信号等杀死)。

如果您需要立即返回,可以将true作为命令传递:

sudo true

但是,在你的情况下,考虑到你正在做的事情,它可能更好,只是将脚本限制为只有超级用户:

#!/bin/sh
set -e

# check we are running as root
if [ $(id -u) != "0" ]; then
    echo "ERROR: this script must be run as a superuser" >&2
    exit 1
fi

然后由用户获得适当的权限,而不是将其编码到脚本中。