如何让'expect`忽略变量?

时间:2018-02-14 09:20:16

标签: shell powershell expect

我需要将String转换为Powershell安全字符串。

目前我打开一个ssh连接并在那里运行我的Powershell命令。问题是,我无法从期望在Powershell中运行变量。

期望中的命令:

send "$SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force\r"

Powershell中的错误:

  

PS C:\ Users \ Administrator> "" ="密码" | ConvertTo-SecureString -AsPlainText -Force

     

在线:1个字符:1 +"" ="密码" | ConvertTo-SecureString -AsPlainText -Force

有人知道如何解决这个问题,或者是否有更简单的解决方案。

也许完整的脚本有助于理解我的问题。

#!/bin/sh
Username="benutzer"
Password="passwort"
login_user="Administrator"
ADServer="192.168.x.x"
function CreateADUser()
{
    Givenname=$1
    Surname=$2
    Email=$3
    export Givenname
    export Surname
    export Email
    Username="$Givenname.$Surname"
        /usr/bin/expect << EOD
        spawn ssh -i ~/.ssh/ADServer $login_user@$ADServer
        expect "*>"
        send "\$SecurePassword = '$Password' | ConvertTo-SecureString -AsPlainText -Force\r"
        expect "*>"
        send "New-ADUser -Name $Username -GivenName $Givenname -SurName $Surname  -SamAccountName $Username -EmailAddress $Email -AccountPassword  $SecurePassword\r"
        expect "*>"
        send "exit\r"
EOD
}

Email=$(dscl /LDAPv3/ldap.example.com -read /Users/$Username EMailAddress)
Email=$(echo "${Email##* }")
FirstName=$(dscl /LDAPv3/ldap.example.com -read /Users/$Username FirstName)
FirstName=$(echo "${FirstName##* }")
LastName=$(dscl /LDAPv3/ldap.example.com -read /Users/$Username LastName)
LastName=$(echo "${LastName##* }")

CreateADUser "$FirstName" "$LastName" "$Email"

2 个答案:

答案 0 :(得分:1)

使用Tcl的非插值引号(set str {$vars not substituted})可减少所需的转义量。但是你需要替换一个变量。

你可以:

  1. 将其分段发送:

    send {$SecurePassword = '}
    send $Password
    send "' | ConvertTo-SecureString -AsPlainText -Force}\r"
    
  2. 使用format这是Tcl的printf命令

    send [format {$SecurePassword = '%s' | ConvertTo-SecureString -AsPlainText -Force\r} $Password]
    
  3. 但如果你可以使用大量的反斜杠,那么常规的双引号就可以了。

答案 1 :(得分:0)

感谢您的帮助。 它现在很棒。我做了一个小改动,我不需要发送这么多的反斜杠或碎片。 现在它只有一个字符串。

send "New-ADUser -Name $Username -GivenName $Givenname -SurName $Surname -SamAccountName $Username -EmailAddress $Email -AccountPassword (ConvertTo-SecureString $Password -AsPlainText -force) -Enabled \\\$true\r"