在bash脚本中提示输入sudo密码并以编程方式提升特权?


49

我目前正在研究一个bash脚本,该脚本可以在现有的Linux系统(当前为Ubuntu)上安装和设置各种程序。因为它安装程序并将大量文件复制到需要提升特权的各种文件夹中,所以我已经完成了标准的“我需要提升特权”并退出。

但是,我希望,如果可能的话,如果用户不使用sudo运行script命令(例如从GUI文件管理器启动它),则能够提示用户输入sudo密码并自动提升脚本的特权,无需用户重新启动脚本。

由于它旨在在库存的Linux安装上运行,因此修改系统的任何选项均无法达到我的目的。所有选项都必须包含在脚本本身中。

在Bash中可能吗?如果是这样,什么是最好的(安全,简洁)方法?



@MichaelMrozek-啊,有这么多利基网站,同时又希望尽量减少碎片的乐趣。而且您知道,在搜索Google时,您从未给过我的链接。
Shauna 2012年


@jww您确实意识到,几乎所有这些链接都是此链接问世大约4年问到的,对吗?
Shauna

1
@Shauna-我想您现在已经解决了这个问题。这些链接供将来的访问者使用。

Answers:



16

我建议:

#!/bin/bash

if (($EUID != 0)); then
  if [[ -t 1 ]]; then
    sudo "$0" "$@"
  else
    exec 1>output_file
    gksu "$0 $@"
  fi
  exit
fi

# some example stuff
ls -l /root
echo "app: $0"
for f; do
  echo ">$f<"
done

if [[ -t 1 ]];检查什么?
Shauna 2012年

喔好吧。我认为这与终端vs GUI有关,但是不确定if语句本身正在检查什么。
Shauna 2012年

太好了,谢谢!
Fire-Dragon-DoL

16

将其添加为脚本的第一行:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

更改sudogksu或,gksudo如果您更喜欢图形提示。


3
请注意,这会将"$*"所有参数合并为一个(/path/to/script one two three将导致$1成为one two three),并且$*不带引号会弄乱参数中的空格。"$@"作品正确
Michael Mrozek

@MichaelMrozek啊,对。那就是我一直在寻找的东西,固定
凯文

有没有办法在似乎没有sudo命令的Debian上执行此操作?
错误的用户名,2015年

@wrongusername install sudo,比使用更好su。但是,如果您真的想要,可能是exec su -c "$0" "$@"
Kevin

2

我不介意分享的示例脚本::

#!/bin/bash
[ "$UID" -eq 0 ] || exec sudo "$0" "$@" && echo -n "sudo bash what: "
read WHAT
sudo $WHAT

--ImP.TeK


[ "$UID" -eq 0 ] || exec sudo "$0" "$@"-看起来真的很高效!真好!
凹槽花蜜18/12/17

在此处使用有效的UID $EUDI还是始终保持相同的结果有意义?例如,[[ "$EUID" -eq 0 ]] || exec sudo "$0" "$@"
凹槽花
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.