如何在 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>
我们使用 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>