在bash脚本执行之间保存密码

时间:2012-09-11 16:39:28

标签: security bash shell sh

我希望我的脚本提示输入密码,但我只希望它每 会话一次(比如半小时)。是否可以安全地在脚本执行之间保存用户的登录凭据?我需要这个是一个bash脚本,因为它必须在几种不同类型的UNIX上运行,我无权在其上安装任何东西。

我在考虑加密我要写入登录凭据的文本文件,但是我会在哪里保存该文件的密码?好像我只是重新制造问题。

我知道运行一个enrypted脚本的实用程序,我非常反对使用它们,因为我不喜欢在一个人们可能需要稍后调试的脚本中保留主密码的想法。

编辑:这不是服务器登录脚本,但使用我无法控制的Web服务器进行身份验证。

编辑2:编辑的会话持续时间

3 个答案:

答案 0 :(得分:2)

根据脚本的“多次调用”所做的事情,您可以使用2个脚本,服务器和客户端,使用命名管道进行通信。警告:这可能是不可移植的。

脚本1“服务器”:

#!/bin/bash

trigger_file=/tmp/trigger
read -s -p "Enter password: "  password
echo 
echo "Starting service"
mknod $trigger_file p
cmd=
while [ "$cmd" != "exit" ]; do
    read cmd < $trigger_file
    echo "received command: $cmd"
    curl -u username:$password http://www.example.com/ 
done
rm $trigger_file

脚本2“客户端”:

#!/bin/bash

trigger_file=/tmp/trigger
cmd=$1
echo "sending command: $cmd"
echo $cmd > $trigger_file

运行:

$ ./server
Enter password: .....
Starting service
received command: go

其他窗口:

$ ./client go
sending command: go

编辑:

这是一个统一的自启动服务器/客户端版本。

#!/bin/bash

trigger_file=/tmp/trigger
cmd=$1

if [ -z "$cmd" ]; then
   echo "usage: $0 cmd"
   exit 1
fi

if [ "$cmd" = "server" ]; then
    read -s password
    echo "Starting service"
    mknod $trigger_file p
    cmd=
    while [ "$cmd" != "exit" ]; do
        read cmd < $trigger_file
        echo "($$) received command $cmd (pass: $password)"
        curl -u username:$password http://www.example.com/ 
    done
    echo exiting
    rm $trigger_file
    exit
elif [ ! -e $trigger_file ]; then
    read -s -p "Enter password: " password
    echo 
    echo $password | $0 server &
    while [ ! -e $trigger_file ]; do
      sleep 1
    done
fi

echo "sending command: $cmd"
echo $cmd > $trigger_file

答案 1 :(得分:1)

将密码保存在任何可访问的位置都可以重新创建问题。每天要求一次凭证而不是每次运行程序基本上与从系统安全性的角度来看根本没有认证系统相同。将密码放在易于阅读的任何地方(无论是纯文本还是纯文本密钥加密)都可以通过向拥有良好系统知识/扫描工具的任何人提供密码来消除您所获得的任何安全性。

解决此问题的传统方法(以及更安全的机制之一)是使用SSH密钥代替密码。一旦用户拥有密钥,他们就不需要手动重新输入他们的身份验证。为了更好的安全性,您可以将SSH密钥登录为仅具有脚本/可执行文件执行权限的用户。因此,他们无法通过读取文件来更改脚本的功能,也无法重现脚本。然后,文件的实际所有者可以轻松编辑/运行脚本,无需身份验证,同时保持其他用户处于受限使用模式。

答案 2 :(得分:0)

通常,密码不会存储(出于安全性),而是存储密码hash。每次用户输入密码时,都会比较哈希以进行身份​​验证。但是,您的要求类似于“记住密码”功能(例如在Web浏览器或Windows应用程序中)。在这种情况下,没有其他方法可以将密码存储在平面文件中,然后使用类似gpg的内容来加密文件,但最后您的加密速度为key

每天向用户询问一次凭据的整个设计与不要求任何凭据一样好。一个严格安全的系统应该设置适当的超时时间,以便在活动时将用户关闭,特别是在后端服务器操作上。