从bash中使用expect内部执行sudo

时间:2014-12-05 20:43:43

标签: linux bash ssh expect

我想创建一个自动在多个Linux主机上安装的脚本。 我使用ssh密钥登录主机,在登录内部我想做一个sudo,我试图使用expect,我在工作站上但是我没有在服务器哪个运行剧本。 我怎么做,这是我的尝试,但没有运气:

#!/bin/bash


ssh user@station04 <<EOF
expect -d -c "
send \"sudo ls\"
expect {
        \"password:\" { send '1234'; exp_continue }
        \"$user@\"{
                send "exit\r"
        }
        default {exit 1}
}"
EOF


exit

结果:

send: sending "sudo ls" to { exp0 }

expect: does "" (spawn_id exp0) match glob pattern "password:"? no
expect: read eof
expect: set expect_out(spawn_id) "exp0"
expect: set expect_out(buffer) ""
argv[0] = expect  argv[1] = -d  argv[2] = -c  argv[3] = 
send "sudo ls\r"
expect {
    "password:" { send '1234';  exp_continue }
    "@"{
        send exitr
    }
    default {exit 1}
}  
set argc 0
set argv0 "expect"
set argv ""

3 个答案:

答案 0 :(得分:0)

A.K

这个怎么样? &lt; - 只需确保预期的提示。

#!/bin/bash

expect <<'END'
spawn ssh user@station04
expect "password:"
send "$pw\r"
expect "#"
send "sudo ls\r"

END

答案 1 :(得分:0)

我建议你对ssh部分使用公钥认证,然后使用类似的东西:

ssh -t username@server-ip -C "echo sudo-password | /usr/bin/sudo -S ls"

答案 2 :(得分:0)

你使用expect不太正确 - 不要send命令;而spawn命令和send只是它的输入。所以,你的脚本变成了:

ssh … <<EOF
expect -d -c "
    spawn sudo ls
    expect -nocase password: { send 1234\r }
    expect eof
"
exit
EOF