运行 Spawn/Expect 加入 Active Directory
Running Spawn/Expect to Join Active Directory
不太确定这是否是提出此问题的正确论坛。但我确实看到很多关于使用 expect/spawn/send 的问题,所以就到这里吧。我正在构建一个 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""
我不确定为什么 realm 抱怨看到多个 realms 但这是我的 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
有人可以告诉我什么会导致 realm 抱怨多个域吗?为什么期望不起作用?
更新:我在脚本中添加了更多的详细信息并收到此错误消息:
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""
您的变量 ad_ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local"
包含 space。
当您在 bash 的 "Here Documents" <<- 功能中使用它时,它会生成完全没有 "" 的期望脚本。 Bash代码:
spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
将生成预期代码
spawn realm join --user=foouser@foo.local --computer-ou=OU=Foo,OU=Foo Servers,DC=foo,DC=local FOO.LOCAL
这符合预期,但正如我所说,您的变量包含 space。
您需要在 expect 中引用。有两种方式:
spawn realm join --user=\""$ad_user"\" --computer-ou=\""$ad_ou"\" \""$ad_domain"\"
或者您可以使用 expect strict quoting with {}:
spawn realm join --user={"$ad_user"} --computer-ou={"$ad_ou"} {"$ad_domain"}
PS: 你也可以像 expect 脚本一样写,不用 bash:
#!/usr/bin/expect -f
set ad_user "foouser@foo.local"
set ad_password "bar"
set ad_ou "OU=Foo,OU=Foo Servers,DC=foo,DC=local"
set ad_domain "FOO.LOCAL"
spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
expect "Password for $ad_user:"
send "$ad_password\r"
interact
@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"
# ...............^.................^
不太确定这是否是提出此问题的正确论坛。但我确实看到很多关于使用 expect/spawn/send 的问题,所以就到这里吧。我正在构建一个 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""
我不确定为什么 realm 抱怨看到多个 realms 但这是我的 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
有人可以告诉我什么会导致 realm 抱怨多个域吗?为什么期望不起作用?
更新:我在脚本中添加了更多的详细信息并收到此错误消息:
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""
您的变量 ad_ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local"
包含 space。
当您在 bash 的 "Here Documents" <<- 功能中使用它时,它会生成完全没有 "" 的期望脚本。 Bash代码:
spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
将生成预期代码
spawn realm join --user=foouser@foo.local --computer-ou=OU=Foo,OU=Foo Servers,DC=foo,DC=local FOO.LOCAL
这符合预期,但正如我所说,您的变量包含 space。 您需要在 expect 中引用。有两种方式:
spawn realm join --user=\""$ad_user"\" --computer-ou=\""$ad_ou"\" \""$ad_domain"\"
或者您可以使用 expect strict quoting with {}:
spawn realm join --user={"$ad_user"} --computer-ou={"$ad_ou"} {"$ad_domain"}
PS: 你也可以像 expect 脚本一样写,不用 bash:
#!/usr/bin/expect -f
set ad_user "foouser@foo.local"
set ad_password "bar"
set ad_ou "OU=Foo,OU=Foo Servers,DC=foo,DC=local"
set ad_domain "FOO.LOCAL"
spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
expect "Password for $ad_user:"
send "$ad_password\r"
interact
@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"
# ...............^.................^