如何让 `expect` 忽略变量?

How can I get `expect` to ignore Variables?

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

此刻我打开了一个 ssh 连接,运行 我的 Powershell 命令在那里。问题是,我无法在 Powershell 中从 expect 到 运行 获取变量。

期望中的命令:

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

Powershell 中的错误:

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

In line: 1 character:1 + "" = "Password" | ConvertTo-SecureString -AsPlainText -Force

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

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

#!/bin/sh
Username="benutzer"
Password="passwort"
login_user="Administrator"
ADServer="192.168.x.x"
function CreateADUser()
{
    Givenname=
    Surname=
    Email=
    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"

使用 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]
    

但是,如果您不介意使用大量反斜杠,那么可以使用常规双引号。

感谢您的帮助。 现在可以了。我做了一个小改动,我不需要用那么多反斜杠或分段发送。 现在它只有一个字符串。

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