Запуск Spawn / Ожидайте присоединения к Active Directory - PullRequest
0 голосов
/ 28 июня 2019

Не совсем уверен, что это правильный форум, чтобы задать этот вопрос.Но я вижу много вопросов, связанных с использованием ожидаемого / 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""

Я не уверен, почему область жалуется на просмотр нескольких областей, но вот мой сценарий 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""

Ответы [ 2 ]

1 голос
/ 28 июня 2019

@ Ответ Комара заставил меня задуматься над их цитатами.Кавычки Tcl являются специальными, только когда они являются первым символом слова (ref: 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"
 # ...............^.................^
1 голос
/ 28 июня 2019

Ваша переменная ad_ou="OU=Foo,OU=Foo Servers,DC=foo,DC=local" состоит из пробела.Когда вы используете его в функции «Здесь документы» << bash, он будет генерировать ожидаемый скрипт без "" вполне.Код Bash: </p>

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

Что вполне ожидаемо, но, как я уже сказал, ваша переменная состоит из пробела.Вам нужно цитату в ожидании.Существует два пути:

    spawn realm join --user=\""$ad_user"\" --computer-ou=\""$ad_ou"\" \""$ad_domain"\"

Или вы можете использовать ожидаемое строгое цитирование с {}:

spawn realm join --user={"$ad_user"} --computer-ou={"$ad_ou"} {"$ad_domain"}

PS: Также вы можете написать его как ожидаемый скрипт, без 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
...