Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell “如何发出命令”;ps";don';在expect脚本中不显示密码?_Shell_Ssh_Tcl_Expect - Fatal编程技术网

Shell “如何发出命令”;ps";don';在expect脚本中不显示密码?

Shell “如何发出命令”;ps";don';在expect脚本中不显示密码?,shell,ssh,tcl,expect,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

我举了一个例子如下。密码(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
#/垃圾箱/垃圾箱
MalbanIP=“XXX.XXX.XXX.XXX”
MalbanLogin=“ming”
MalbanPwd=“mingps”
MalbanCmd=“netstat”
firstTime=“true”
/usr/bin/expect选项1
最好的方法是切换到使用RSA密钥登录,因为这将使您能够显著增强总体系统安全性。这样,您就可以完全避免使用Expect

选择2 但是,如果您不能做到这一点,解决问题的关键是不要将其作为参数或环境变量传递(因为
ps
可以通过正确的选项同时看到这两个变量)。相反,您可以通过将密码写入文件并将该文件的名称提供给Expect脚本来传递密码。文件需要位于只有当前用户才能读取的目录中
chmod go rx
将在这方面有所帮助

MalbanPwdFile=/home/malban/.securedDirectory/examplefile.txt
您可能还需要在使用
$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密钥,这是我在自己的基础设施上部署的),我认为它将避免您在当前代码中遇到的一些微妙的错误(由于在错误的时间替换变量).

另一种方法是将运行该脚本的用户的ssh公钥添加到远程服务器用户的允许列表中。这样,您就可以通过ssh连接到它,而无需ssh询问密码。感谢您回答我的所有问题。
#!/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