如何让 `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}
) 减少了所需的转义量。但是你需要一个变量来代替。
你可以:
分段发送:
send {$SecurePassword = '}
send $Password
send "' | ConvertTo-SecureString -AsPlainText -Force}\r"
使用 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"
我需要将字符串转换为 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}
) 减少了所需的转义量。但是你需要一个变量来代替。
你可以:
分段发送:
send {$SecurePassword = '} send $Password send "' | ConvertTo-SecureString -AsPlainText -Force}\r"
使用
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"