首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行子程序/期望加入

运行子程序/期望加入
EN

Stack Overflow用户
提问于 2019-06-28 14:02:03
回答 2查看 604关注 0票数 0

不太确定这是否是问这个问题的正确论坛。但是,我确实看到了很多关于使用expect/派生/send的问题,所以就这样做了。我正在构建一个bash脚本来加入域。当我尝试执行脚本时,我会得到以下错误:

代码语言:javascript
复制
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脚本:

代码语言:javascript
复制
#!/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

有人能告诉我是什么导致领域抱怨多个域吗?为什么expect不起作用?

更新:我在脚本中添加了更详细的内容,并得到了以下错误消息:

代码语言:javascript
复制
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""
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-28 17:20:11

@komar的回答让我想起了他们的话。只有当Tcl引号是单词的第一个字符时,它们才是特殊的(ref:https://tcl.tk/man/tcl8.6/TclCmd/Tcl.htm,规则4和6)。

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

代码语言:javascript
复制
% 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命令发送文字双引号。

所以,试试这个:改变

代码语言:javascript
复制
 spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"
 # ......................^........................^

代码语言:javascript
复制
 spawn realm join "--user=$ad_user" "--computer-ou=$ad_ou" "$ad_domain"
 # ...............^.................^
票数 2
EN

Stack Overflow用户

发布于 2019-06-28 16:25:53

您的变量ad_ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local"包含空间。当您在bash的“这里文档”<- feature中使用它时,它将生成expect脚本而不需要“will”。Bash代码:

代码语言:javascript
复制
spawn realm join --user="$ad_user" --computer-ou="$ad_ou" "$ad_domain"

将生成预期的代码

代码语言:javascript
复制
spawn realm join --user=foouser@foo.local --computer-ou=OU=Foo,OU=Foo Servers,DC=foo,DC=local FOO.LOCAL

这对expect来说是可以的,但正如我所说的,您的变量包含空间。你需要在期望值中引用。有两种方法:

代码语言:javascript
复制
    spawn realm join --user=\""$ad_user"\" --computer-ou=\""$ad_ou"\" \""$ad_domain"\"

也可以使用expect严格引用{}:

代码语言:javascript
复制
spawn realm join --user={"$ad_user"} --computer-ou={"$ad_ou"} {"$ad_domain"}

PS:您也可以将其编写为expect脚本,而无需bash:

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56808386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档