如何使命令 "ps" 在 expect 脚本中不显示密码?
how to make command "ps" don't show password in expect script?
我做了一个例子如下。密码(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
最好的方法是切换到使用 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 密钥,这是我在自己的基础设施上部署的密钥)而且我认为它会避免一些细微的错误已进入您当前的代码(由于在错误的时间替换了变量)。
我做了一个例子如下。密码(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
最好的方法是切换到使用 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 密钥,这是我在自己的基础设施上部署的密钥)而且我认为它会避免一些细微的错误已进入您当前的代码(由于在错误的时间替换了变量)。