在 Cygwin 中运行 Bash 脚本

在 Cygwin 中运行 Bash 脚本

安装了 Cygwin,编写了脚本,测试成功。但是当我将其作为 Windows 计划任务运行时,它失败了。进一步挖掘表明,以这种方式运行脚本时并非所有程序都可用。例如,启动 Mintty 并输入ls将列出我的目录的内容。

从 Windows CLI 运行 bash.exe 会将我置于 Bash 提示符中,但这ls不是可识别的命令。

我已经尝试过标准

c:\cygwin\bin\bash.exe -l -c "/home/user/logoff.sh"

以及

c:\cygwin\bin\mintty.exe /bin/bash -l -c "/home/user/logoff.sh"

我添加了一个输出到文本文件的 echo 命令,这个命令有效,所以我知道脚本被调用了。问题似乎要么是各种程序不可用,要么是它不喜欢我所做的管道。

这是我正在尝试运行的脚本。

for user in user1 user2 user3 ;
do
id=$(query user $user 2>> /dev/null | awk '{ print $3 }' | sed -e '/ID/ d')
if [[ "$id" =~ ^[1-9][0-9]?$ ]]; then
logoff $id
echo "$user was logged off" >> logg_off.log
fi
done

有任何想法吗?

以下是更多信息:

  1. 我在计划任务中输入了文件名,导致它运行失败。
  2. 仍然不确定为什么脚本无法完成。我从列表中删除了除一个用户之外的所有用户,一切正常。必须等到今晚才能测试我是否可以一次性注销其他用户。

答案1

经过一番折腾,我发现当用户断开连接时,会话 ID 会被删除。它不会插入制表符或类似符号作为占位符,而是插入空格。

因此,当 Awk 打印出该列时,会打印错误的信息。以下是在 Windows Server 中作为计划作业运行的最终脚本。

for user in user1 user2 user3 ;
do
id=$(query user $user 2>> /dev/null | awk '{ print $3 }' | sed -e '/ID/ d')
if [[ "$id" =~ ^[1-9][0-9]?$ ]]; then
logoff $id
date >> /cygdrive/c/log_off.log
echo "$user was logged off" >> /cygdrive/c/log_off.log
else
id2=$(query user $user 2>> /dev/null | awk '{ print $2 }' | sed -e '/SESSIONNAME/ d')
if [[ "$id2" =~ ^[1-9][0-9]?$ ]]; then
logoff $id2
date >> /cygdrive/c/log_off.log
echo "$user was logged off" >> /cygdrive/c/log_off.log
fi
fi
done

相关内容