首页 > 解决方案 > 运行 Spawn/Expect 加入 Active Directory

问题描述

不太确定这是否是提出这个问题的正确论坛。但是我确实看到了很多特定于使用期望/生成/发送的问题,所以就这样吧。我正在构建一个 bash 脚本来加入 Active Directory 域。当我尝试执行脚本时,出现此错误:

spawn realm join --user="foouser@foo.local" --computer-ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local" FOO.LOCAL
realm: Specify one realm to join
send: spawn id exp6 not open
    while executing
"send "foobarpassword\r""

我不确定为什么领域会抱怨看到多个领域但这是我的 bash 脚本:

#!/bin/bash
ad_user="foouser@foo.local"
ad_password="bar"
ad_ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local"
ad_domain="FOO.LOCAL"

expect <<-EOD
     spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
     expect "Password for foouser@foo.local:"
     send "$ad_password\r"
     interact
EOD

有人可以告诉我什么可能导致领域抱怨多个域?为什么期望不起作用?

更新:我在脚本中添加了更多详细信息并收到此错误消息:

spawn realm join --user="foouser@FOO.LOCAL" --computer-ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local" FOO.LOCAL
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {883}
Gate keeper glob pattern for 'Password for foouser@FOO.LOCAL: ' is 'Password for foouser@FOO?LOCAL: '. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "Password for foouser@FOO.LOCAL: "? Gate "Password for foouser@FOO?LOCAL: "? gate=no
realm: Specify one realm to join

    expect: does "realm: Specify one realm to join\r\n" (spawn_id exp6) match regular expression "Password for foouser@FOO.LOCAL: "? Gate "Password for foouser@FOO?LOCAL: "? gate=no
    expect: read eof
    expect: set expect_out(spawn_id) "exp6"
    expect: set expect_out(buffer) "realm: Specify one realm to join\r\n"
    send: sending "bar\n" to { exp6 send: spawn id exp6 not open
        while executing
    "send -- "bar\n""

标签: bashexpect

解决方案


@komar 的回答让我想到了他们的报价。Tcl 引号仅在它们是单词的第一个字符时才是特殊的(参考:https ://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm ,规则 4 和 6)。

例如,考虑这个交互式 tclsh 会话:

% proc spawn args {puts $args}
% set ad_user     "foouser@foo.local"
foouser@foo.local
% set ad_password "bar"
bar
% set ad_ou       "OU=Foo,OU=Foo Servers,DC=foo,DC=local"
OU=Foo,OU=Foo Servers,DC=foo,DC=local
+% set ad_domain   "FOO.LOCAL"
FOO.LOCAL
%
% spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
realm join --user=\"foouser@foo.local\" {--computer-ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local"} FOO.LOCAL

请注意如何保护双引号。这表明您正在向realm命令发送文字双引号。

所以试试这个:改变

 spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
 # ......................^........................^

 spawn realm join "--user=$ad_user" "--computer-ou=$ad_ou" "$ad_domain"
 # ...............^.................^

推荐阅读