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

Fab*_*bby 21 bash sudo scripts

数据

  • 我希望这台机器上的操作员用户挂载自己的 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'
Run Code Online (Sandbox Code Playgroud)

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

  • 一次为 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'
Run Code Online (Sandbox Code Playgroud)

...但这需要我允许所有运营商用户能够sudo sh(主要安全问题)

如何安装CIFS共享在bash ¹没有把shsudoers的文件,也没有建立一个永久/临时文件???

注 1:没有 python、perl、C、Go,...好吗?
注 2:我知道我可以通过sudoers文件删除密码,但我试图加强安全性,而不是放松它,同时又不放弃便利......

Bra*_*iam 27

您应该改为让用户调用使用 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
Run Code Online (Sandbox Code Playgroud)

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


Fab*_*bby 8

我傻了!

以下脚本:

#!/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"
Run Code Online (Sandbox Code Playgroud)

只是工作和:

  1. 不创建任何包含密码的文件
  2. 允许用户只为多个共享(包括 Windows 共享)键入一个密码
  3. 无需授予额外权限。 :-)

  • @Rinzwind 作为内置,它不应该在 bash 或 zsh 中。但是 mount 命令可以。 (3认同)