如何制作命令" ps"在预期脚本中不显示密码?

时间:2016-05-20 07:06:54

标签: shell ssh tcl expect

我举了一个例子如下。密码(mingps)是shell变量。当执行shell脚本时,同时执行命令" ps -ef",我找到了" ps"的结果。显示密码(mingps)。出于安全原因,我不想在执行命令" ps -ef"时显示密码。那么如何隐藏呢?提前谢谢。

#!/bin/sh
MalbanIP="XXX.XXX.XXX.XXX"
MalbanLogin="ming"
MalbanPwd="mingps"
MalbanCmd="netstat"
firstTime="true"

/usr/bin/expect <<EOF
set timeout 10
log_user 0
spawn /usr/bin/ssh $MalbanIP -l $MalbanLogin
expect {
    -nocase "continue connecting (yes/no)?" {
        send "yes\r"
        expect "password:" {
            send "$MalbanPwd\r"; set firstTime "false"; exp_continue
        }
    }
    "password" {
        if {$firstTime == "true"} {
            send "$MalbanPwd\r"; set firstTime "false"
        } else {
            log_user 1; puts stdout "password is wrong"; log_user 0;
            exit 1
            }
    }
}
expect "0-0-3"
log_user 1
send "$MalbanCmd \r"
set results \$expect_out(buffer)
expect "0-0-3" { send "exit\r" }
expect eof
EOF
exit 0

1 个答案:

答案 0 :(得分:3)

选项1

最好的方法是切换到使用RSA密钥登录,因为这将使您显着增强整体系统安全性。有了这个,你可以完全避免使用Expect。

选项2

但是,如果你不能这样做,修复问题的关键是不要将它作为参数或环境变量传递(因为ps可以使用正确的选项看到)。而是通过将密码写入文件并将该文件的名称提供给Expect脚本来传递密码。该文件需要位于只有当前用户可以读取的目录中; chmod go-rx会在那里提供帮助。

MalbanPwdFile=/home/malban/.securedDirectory/examplefile.txt
# Put this just before the spawn
set f [open $MalbanPwdFile]
set MalbanPwd [gets $f]
close $f

您可能还需要在使用$MalbanPwd之前加上反斜杠,以免过早地被shell脚本部分替换。

选项3

或者您可以停止使用该shell包装器并直接在Tcl / Expect中执行所有操作。

#!/usr/bin/expect
set MalbanIP "XXX.XXX.XXX.XXX"
set MalbanLogin "ming"
set MalbanPwd "mingps"
set MalbanCmd "netstat"

set firstTime true
set timeout 10
log_user 0
spawn /usr/bin/ssh $MalbanIP -l $MalbanLogin
expect {
    -nocase "continue connecting (yes/no)?" {
        send "yes\r"
        expect "password:" {
            send "$MalbanPwd\r"
            set firstTime false
            exp_continue
        }
    }
    "password" {
        if {$firstTime} {
            send "$MalbanPwd\r"
            set firstTime false
        } else {
            log_user 1
            puts stdout "password is wrong"
            log_user 0
            exit 1
        }
    }
}
expect "0-0-3"
log_user 1
send "$MalbanCmd \r"
set results \$expect_out(buffer)
expect "0-0-3" { send "exit\r" }
expect eof

我怀疑最后一个选项在长期内最适合你。它肯定是最简单的一个(除了切换到RSA密钥,这是我在自己的基础架构上部署的),我认为这将避免你遇到的一些微妙的错误您当前的代码(由于在错误的时间替换变量)。