【问题标题】:Execute sudo using expect inside ssh from bash在 bash 的 ssh 中使用 expect 执行 sudo
【发布时间】:2017-04-18 16:39:06
【问题描述】:

我想创建一个在多个 linux 主机上自动安装的脚本。 我使用 ssh 密钥登录到主机,在登录内我想做一个 sudo,我正在尝试使用期望,它在站上但 我在服务器上没有 运行剧本。 我该怎么做,这是我的尝试,但没有运气:

#!/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 ""

【问题讨论】:

  • 您是否可以控制这些系统上的/etc/sudoers?如果是这样,最好的方法是修改该文件并指定ls(或您正在运行的其他任何东西)可以由user 调用而无需密码。这样一来,您就不会在代码中嵌入明文密码并冒着被盗的风险。
  • 不,我无法控制 sudoers。完成后我会从脚本中删除密码
  • 除了“不走运”之外,您是否有关于失败的描述?是否有任何消息(例如,关于缺少 tty 的投诉)?

标签: linux bash ssh expect


【解决方案1】:

A.K

这个呢?

#!/bin/bash

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

END

【讨论】:

  • 我对服务器没有期望
【解决方案2】:

我建议您对 ssh 部分使用公钥身份验证,然后只需使用以下内容:

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

【讨论】:

  • 先rsync一个脚本然后使用sudo和上面的命令运行它怎么样?
  • 你为什么不把一个完整的脚本复制到目的地,然后运行它,然后删除它!。
  • 反正问题出在sudo,因为我不想复制到15个站,我只想执行一次
【解决方案3】:

您对expect 的用法不太正确- 不要将send 用作命令;而spawn 命令和send 只是它的输入。因此,您的脚本变为:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2020-01-06
    • 1970-01-01
    • 2017-08-02
    • 2012-02-26
    • 2016-08-04
    • 2011-06-14
    相关资源
    最近更新 更多