ssh
我最近买了一台笔记本电脑,并编写了一个脚本,如果某个用户通过 GDM 登录,则该脚本会设置反向隧道。我这样做是因为我的笔记本电脑过去被盗过,并且希望做好准备,以防再次发生这种情况。
我将脚本放在以下目录中,只要用户登录,GDM 就会以 root 身份运行。
/etc/gdm/PostLogin/Default
这是脚本本身:
if [[ "$(users)" = "user user" ]]; then
while (( "$(netstat -an | grep -E "\:22[ \t]+" | grep ESTABLISHED | \
wc -l)" < "1" ))
do
ssh -fvN -p 22 -R tunnelport:localhost:sshdport [email protected]
sleep 20
done
fi
如果我已经登录,该脚本就会运行,但如果我通过 GDM 登录,第一个if
语句就会失败。如果我删除该if
语句,那么它会挂在ssh
命令上。关于我能做什么有什么想法吗?
答案1
我将启用此脚本,使其变得详细并将其输出写入文件,以便您可以更轻松地确定是什么导致了它的问题。
为了增加冗长性,请在第一个if
语句之前添加此内容。
set -x
要让脚本将所有内容记录到文件中,您可以使用此 SO Q&A 标题中描述的方法:如何完整记录所有 bash 脚本操作?。以下内容大部分摘自该帖子:
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':
解释:
exec 3>&1 4>&2
保存文件描述符,以便它们可以恢复到重定向之前的状态,或者使用自身输出到以下重定向之前的状态。
trap 'exec 2>&4 1>&3' 0 1 2 3
恢复特定信号的文件描述符。通常不需要,因为它们应该在子 shell 退出时恢复。
exec 1>log.out 2>&1
将 stdout 重定向到文件 log.out,然后将 stderr 重定向到 stdout。请注意,当您希望它们进入同一个文件时,顺序很重要。在将 stderr 重定向到 stdout 之前,必须先重定向 stdout。