无密码登录

时间:2012-08-20 09:03:49

标签: bash unix expect

问题陈述

我想访问服务器而不询问密码(将在脚本中提及)并在该服务器上运行命令。

我的代码

#!/usr/bin/expect
spawn sudo su - <server_name>
expect "[sudo] password for chronicles:"
set Password "xxxxxxx"
send "$Password\r"
#set timeout 300
send "whoami\r"
send "ls -ltr\r"
expect eof

输出

invalid command name "sudo"
    while executing

限制

  • 我没有更改env变量或修改的访问权限 .bash_profile / .bashrc。
  • su server_name命令不允许

3 个答案:

答案 0 :(得分:8)

大卫是对的,通常这是一个糟糕的想法。有偶尔做这件事的好理由,或做类似的事情(例如自动登录串口控制台进行熄灯管理),但是你没有提供任何关于为什么它对你有意义的指示这样做。

除了警告之外,invalid command name并非来自spawn行,而是来自[sudo]行中的expect。期望基于tcltreats [] square parentheses as special characters indicating command substitution。此外,传递给expect的值是 glob 模式而不是固定字符串,[]方括号也是globs中的特殊字符。所以你要找的答案是引用那些字符两次

    expect "\\\[sudo\\\] password for chronicles:"

另请注意,在发送密码后,您可能应该包含另一个expect行以等待root shell提示。

答案 1 :(得分:2)

在不提示输入密码的情况下访问服务器的安全方法是通过SSH上的键控登录。 请勿以纯文本形式提供密码。

如果你只是谷歌,你会发现很多文章解释如何做到这一点。 SSH login without password是一个非常好的解释。

答案 2 :(得分:1)

[]Tcl中被解释为“命令引号”(“工具命令语言”中的“命令”,这是Tcl的缩写)。

{}Tcl中最强的引语,您可以使用它来阻止任何解释:

expect {[sudo] password for chronicles:}

当然你也可以省略[sudo]

expect "password for chronicles:"