AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 711580
Accepted
Fabby
Fabby
Asked: 2015-12-21 06:43:53 +0800 CST2015-12-21 06:43:53 +0800 CST 2015-12-21 06:43:53 +0800 CST

如何在需要 sudo 的 bash 脚本中只输入一次密码

  • 772

数据

  • 我希望这台机器上的操作员用户挂载他们自己的 cifs 共享
  • 该sudoers文件已包含/bin/mount -t cifs //*/* /media/* -o username=*所有操作员的命令
  • 我希望用户通过脚本只输入一次密码来安装cifs共享,而不是两次。
  • sudo 密码和 cifs 密码相同。

我已经拥有的

该脚本有效:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

...但它要求用户输入相同的密码两次!

  • 一次为sudo
  • 一次用于安装本身

这也可以:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

...但这需要我允许所有操作员用户能够sudo sh(主要安全问题)

问题

如何在不放入文件或创建永久/临时文件的情况下在 bash中挂载 cifs 共享???shsudoers

注 1:没有 python,perl,C,Go,...拜托?
注意2:我知道我可以通过sudoers文件删除密码,但我试图加强安全性,而不是放松它,而不是放弃方便......

bash
  • 4 4 个回答
  • 35882 Views

4 个回答

  • Voted
  1. Braiam
    2015-12-21T14:11:07+08:002015-12-21T14:11:07+08:00

    相反,您应该让用户调用 using sudo as sudo script。只需检查脚本是否以 root 身份运行,如果不要求它

    if [[ $EUID -ne 0 ]]; then
       echo "This script must be run as root, use sudo "$0" instead" 1>&2
       exit 1
    fi
    

    不要试图获取用户的密码。

    • 27
  2. Best Answer
    Fabby
    2015-12-21T07:16:23+08:002015-12-21T07:16:23+08:00

    我很笨!

    以下脚本:

    #!/bin/bash
    read -p "Password: " -s szPassword
    printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"
    

    只是工作,并且:

    1. 不创建任何包含密码的文件
    2. 允许用户为多个共享(包括 Windows 共享)键入一个密码
    3. 无需授予额外特权。 :-)
    • 10
  3. Oliphaunt
    2015-12-21T09:42:30+08:002015-12-21T09:42:30+08:00

    执行此命令不需要sudo密码;密码提示mount仍然存在。

    在sudoers中,包括类似的东西

    ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
    

    包含此内容后,sudo将不再要求此特定命令的密码;用户仍然需要为mount命令提供密码。

    注意:我从您在问题中包含的内容中逐字获取命令;我没有检查它的通配符是否允许用户做一些讨厌的事情。阅读sudoers手册页以获取肮脏的示例。 特别要注意的是,这一行sudoers允许用户添加任意​​数量的-o开关或其他参数到mount. 您可能需要重新考虑您的方法,例如通过添加诸如@Braiam 建议的脚本并允许在sudo没有额外身份验证的情况下运行该脚本。然后,该脚本确保用户只能运行mount您希望他们运行的特定形式。

    此外,除了允许所有用户这样做,您还可以将其限制为某个组的成员,例如,您可以创建一个组cifsmount,然后拥有

    %cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
    
    • 3
  4. arielf
    2015-12-26T19:05:20+08:002015-12-26T19:05:20+08:00

    这些问题的一般解决方案是将以下序言放在需要 sudo 的脚本的顶部:

    #!/bin/bash
    case $EUID in
       0) : cool we are already root - fall through ;;
       *) # not root, become root for the rest of this session
          # (and ask for the sudo password only once)
          sudo $0 "$@" ;;
    esac
    # now the present process is effective-UID  (root)
    # so there's no need to put sudo in front of commands
    
    any more commands here will run as superuser ...
    

    显然,这有一个缺点,如果脚本中的某些命令不需要sudo运行,那么这里就有不必要的特权提升。

    无论如何,我想我会分享这个小技巧。最好的一点是,如果您已经是有效的 uid root(例如,如果您已经在 sudo 下调用它),它会优雅地做正确的事情。同样给出错误并强迫您重新输入/重新运行(使用 sudo)也不太友好。

    您可能还想查看timestamp_timeout变量,man 5 sudoers其中告诉sudo记住用户凭据有限的分钟数(并且可以是分数)。

    • 1

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve