4

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

我正在考虑加密一个文本文件,我将在其中写入登录凭据,但我将把该文件的密码保存在哪里?好像我只是重新创建问题。

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

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

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

4

3 回答 3

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
于 2012-09-11T19:44:00.053 回答
1

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

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

于 2012-09-11T16:54:27.030 回答
0

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

每天询问用户一次凭据的整个设计与不询问任何凭据一样好。一个高度安全的系统应该设置适当的超时时间,以使用户因不活动而注销,尤其是在后端服务器操作上。

于 2012-09-11T18:20:05.957 回答