【问题标题】:How to pass variables from a bash script to TCL?如何将变量从 bash 脚本传递到 TCL?
【发布时间】:2018-06-14 14:00:01
【问题描述】:

我以前从未使用过 TCL,但我需要使用它才能在我们使用的工具中编写命令脚本。我有一个 bash 脚本正在运行,它从 AD 获取一些信息,然后将其传递给 TCL 脚本以使用。这是我的 bash 脚本,运行没有任何问题。

echo "Enter username for LDAP Search"

read USERNAME
export USERNAME

echo "Enter password"

read -s PASSWORD
export PASSWORD

echo "What user do you want to add to Centrify?"
read CENTRIFY_USER
export CENTRIFY_USER


OBJECTSID=`ldapsearch -H ldap://my.domain.com:389 -D "$USERNAME@MY.REALM.COM" -w $PASSWORD -x -b "DC=my,DC=domain,DC=com" "(&(objectCategory=user)(sAMAccountName=$CENTRIFY_USER))" | grep objectSid | cut -d " " -f2`
SID=`/home/mydirectory/convert_objectSid_to_sid.sh $OBJECTSID`

export SID

echo "Adding user to Centrify..."
/home/mydirectory/add_users_to_centrify.sh

"add_users_to_centrify.sh" 是随后调用的 tcl 脚本,但我在 tcl 脚本中收到错误 error during execution: can't read "USERNAME": no such variable

以下是其中的内容:

#!/bin/sh
# \
exec adedit "$0" ${1+"$@"}
package require ade_lib

puts $env(USERNAME)
puts $env(PASSWORD)
puts $env(SID)
puts $env(CENTRIFY_USER)

bind my.domain.com $USERNAME {$PASSWORD}

另一个问题,当调用 tcl 脚本时,我传递的所有参数都会被打印出来,包括密码。我曾认为导出是最安全的方法,因为它应该只为这个子 shell 设置环境变量,而不是打印它们。这里发生了什么?

【问题讨论】:

    标签: bash tcl centrify


    【解决方案1】:

    密码正在打印,因为您明确打印了密码 (puts $env(PASSWORD))。

    错误似乎很明显:在名为USERNAME 的tcl 脚本中没有变量。你可以这样设置(PASSWORD 也一样):

    set USERNAME $env(USERNAME)
    

    或者你可以直接使用环境变量:

    bind my.domain.com $env(USERNAME) {$env(PASSWORD)}
    

    【讨论】:

    • @Josh puts 输出字符串(用于调试,但通常在工作正常后删除),set 设置变量。我们尝试使用“明显”的名称,记住我们也很懒(所以expr 计算表达式但写起来更短),但对我们来说显而易见的东西对每个人来说并不明显。显然……
    • @DonalFellows 现在对我来说很有意义!我必须承认我从其他人的 tcl 脚本中使用环境变量提取了变量操作代码,所以我没有深入研究文档并根据命名进行假设。直到这个答案才知道 set 命令存在。可能应该有 RTFM...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2011-04-26
    • 1970-01-01
    • 2015-07-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多