如何在 ColdFusion rsh 命令中更改用户的主要 unix 组?

How do you change a user's primary unix group in a ColdFusion rsh command?

我们使用 rsh 命令将文件签入 ClearCase:

<cfexecute name="C:\cygwin64\bin\rsh.exe"
    arguments="-n -l #USERNAME# #SERVER# ""cleartool setview -exec '#KSH_FILE# -user #USERNAME# -dir #VOB_DIRECTORY#' #CLEARCASE_VIEW#"" "
    timeout="180"
    variable="CHECKIN_FILE_CONTENT">
</cfexecute>

但是 运行 遇到一个问题,即用户的主要 unix 组设置为与用户尝试将文件签入的 VOB 不同的组。

我需要 运行 在执行 #KSH_FILE#

之前 newgrp 命令

我确信这会奏效:

<cfexecute name="C:\cygwin64\bin\rsh.exe"
    arguments="-n -l #USERNAME# #SERVER# ""newgrp #GROUP#; cleartool setview -exec '#KSH_FILE# -user #USERNAME# -dir #VOB_DIRECTORY#' #CLEARCASE_VIEW#"" "
    timeout="180"
    variable="CHECKIN_FILE_CONTENT">
</cfexecute>

但它一直超时..没有错误,只是旋转并停止。

---更新--- 经过进一步测试,cfexcute 和 rsh 似乎不允许使用多个命令。这是我试过的一个示例测试,它产生了同样的问题:

<cfexecute name="C:\cygwin64\bin\rsh.exe"
    arguments="-n -l #USERNAME# #SERVER# ""newgrp #GROUP#; id -a > results.txt"" "
    timeout="180">
</cfexecute>

不要使用(因为 I explained here) cleartool setview: it forks the current shell 这就是为什么 newgrp 和 setview 无法正常通信的原因:它们会触发自己的 shell。

如果您需要对动态视图执行任何操作,请使用其完整路径 (/view/<aview>/vobs/<avob>),不要使用 setview。这样,如果需要,您可以使用 newgrp

我最终创建了一个 launchcheckin.ksh 脚本来更改 shell 中的用户组。我只是将我想要执行的命令作为参数传递给脚本,更改脚本中的组并在 newgrp 流中执行命令!我们已经将其投入生产 6 个月,一切顺利。

launchcheckin.ksh

FILE=""
GROUP=""
COUNT=1
for argument in $*
  do
    if [ ${COUNT} -gt 2 ]
      then
        ARGUMENTS="${ARGUMENTS} ${argument}"
      fi
    ((COUNT+=1))
done

newgrp ${GROUP} << EOF
${FILE} ${ARGUMENTS}
EOF

更新命令

<cfexecute name="C:\cygwin64\bin\rsh.exe"
    arguments="-n -l #USERNAME# #SERVER# ""cleartool setview -exec '/launchcheckin.ksh #KSH_FILE# #GROUP# #ARGUMENTS#' #CLEARCASE_VIEW#"" "
    timeout="180"
    variable="CHECKIN_FILE_CONTENT">
</cfexecute>