![编写 samba 密码但安全的脚本](https://linux22.com/image/65470/%E7%BC%96%E5%86%99%20samba%20%E5%AF%86%E7%A0%81%E4%BD%86%E5%AE%89%E5%85%A8%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我想在 samba 用户和密码上编写添加脚本。
我见过与这里类似的解决方案
echo -ne "$PASS\n$PASS\n" | smbpasswd -a -s $LOGIN
但所有看到脚本的人都可以看到密码。我如何使用哈希值并将其作为密码?
答案1
如果您的 smb.conf 包含passdb backend = tdbsam
您可以在已设置的系统上导出带有加密密码的文件,请使用:
sudo pdbedit -e smbpasswd:/tmp/smbpasswd
这将创建/tmp/smbpasswd
包含用户名和哈希值的文件。它是一个文本文件,您可以轻松查看并可能删除包含您不感兴趣的用户的行。
可以使用以下命令重新导入用户:
sudo pdbedit -i smbpasswd:/tmp/smbpasswd -e tdbsam:/var/lib/samba/private/passdb.tdb
中的用户/tmp/smbpasswd
将被添加到 samba 用户数据库中,或者如果已存在则被覆盖。
/var/lib/samba/private/passdb.tdb
是 Ubuntu 中 samba 用户数据库文件的位置。
答案2
您的脚本必须能够访问密码。您不能使用密码的哈希值:如果您这样做,哈希值将是密码,因为这意味着任何拥有哈希值的人都可以登录。
您应该将密码放在单独的文件中,并从脚本中读取它。请注意准确地重现密码(例如,不要使用,echo -e "$PASS"
因为这会解释反斜杠转义)。
IFS= read -r password </somewhere/private/file.password
printf '%s\n%s\n' "$password" "$password" | smbpasswd -a -s "$LOGIN"
或者
IFS= read -r password </somewhere/private/file.password
smbpasswd -a -s "$LOGIN" <<EOF
$password
$password
EOF
当命令运行时,传递给外部命令的参数对其他进程是可见的,因此如果printf
是 shell 中的外部命令,请不要使用第一个解决方案。目前大多数 shellprintf
都内置了;使用type
命令查看,或者这里的文档形式。
确保包含密码的文件只能由应执行脚本的用户读取。当然,以该用户身份运行的任何命令都可以读取该脚本;如果这是不可取的,那么您需要以不同的用户身份运行脚本(或使用其他一些隔离机制,但单独的用户是最容易设置的)。