在bash中使用密码并期望的安全方式

时间:2018-08-27 21:36:56

标签: bash encryption passwords expect

bash如何使用密码安全地调用Expect脚本?

我有两个脚本:一个由用户直接执行的bash脚本,以及一个由bash脚本调用并使用bash脚本中提供的密码登录到远程主机的Expect脚本。

bash脚本(main.sh)

#!/bin/bash

read -p "User: " user
read -s -p "Password: " password

./login.expect "$user" "$password"

期望脚本(login.expect)

#!/usr/bin/expect --

set user [lindex $argv 0]
set password [lindex $argv 1]
set host 192.168.1.15

spawn ssh $user@$host
expect -re ".*ssword.*" { send "$password\n" }    # Send password
expect -re ":~\\\$" { send "ls\n" }               # Do stuff
expect -re ":~\\\$" { send "exit\n" }             # exit

此设置的至少一个问题是,由于可以在命令行中提供密码,因此有人可以通过使用“ ps -ef”监视进程来学习密码。

这些脚本与我的实际脚本相比已大大简化,因为我只是想了解这部分内容是否可以通过某种方式安全地完成。我的实际用例非常复杂,需要将bash和Expect脚本分​​开,所以我不能只将Expect嵌入bash中,也不能从Expect脚本中请求密码。同样不幸的是,ssh密钥不是无密码登录的选项。我可以重新构造Expect脚本,以通过命令行选项以外的其他方式获取密码,但是我不确定哪种选择会更好。

我目前最好的选择是用bash加密密码,将加密的密码作为参数传递给Expect脚本,并期望解密密码(我没有确切的方法来解决这一问题)。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以在某种程度上安全地通过环境传递密码,因为该密码只能由同一用户和root读取。在外壳export passwordexpect脚本中

set password $env(password)

答案 1 :(得分:0)

从文件中读取密码

set passfile [open "~/.sshpass" r]
gets $passfile userpass
close $passfile

还有chmod 700 ~/.sshpass