Groovy - 执行ssh并提供密码

时间:2013-06-14 19:24:39

标签: groovy ssh

我知道有AntBuilderJSch等,但我想做类似的事情 - 没有任何依赖:

def sshArray = ["ssh root@11.11.11.11 -p 111 '/etc/init.d/tomcat7 stop'", ...]

def env = System.getenv().collect { k,v -> "$k=$v" }

sshArray.each {
    println "Executing: " + it
    def process = (it).execute(env, null)
    def writer = new PrintWriter(new BufferedOutputStream(process.out))
    writer.println("mypassword")
    writer.close()
    process.waitFor()
    process.consumeProcessOutput(System.out, System.err)
}

但遗憾的是,这不起作用,因为我得到的输出是:

Executing: ssh root@11.11.11.11 -p 111 '/etc/init.d/tomcat7 stop'
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
...

此外,如果我注释掉这些行,我会得到相同的输出:

def writer = new PrintWriter(new BufferedOutputStream(process.out))
writer.println("mypassword")
writer.close()

为什么我3次获得“权限被拒绝”?如何为ssh进程提供密码? 这可能吗?

2 个答案:

答案 0 :(得分:4)

像ssh这样的程序通常不会从标准输入中读取密码;他们直接从终端阅读。 Java和groovy不提供任何控制终端的方法。

这不是ssh或Java的问题:密码是由一个人输入的。如果您的程序需要使用ssh,则使用它的正确方法是使用基于密钥的身份验证。

答案 1 :(得分:0)

很抱歉,但我认为你正在做的是启动一个进程,然后消耗它的输出(process.out)。您应该将输入提供给流程。它应该是您正在处理的 InputStream