Arch-Linux
GDM 登錄 GNOME 後執行腳本?
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 user@example.com sleep 20 done fi
如果我已經登錄,腳本就會執行,但如果我通過 GDM 登錄,第一條
if
語句就會失敗。如果我刪除該if
語句,那麼它會掛在ssh
命令上。關於我能做什麼的任何想法?
我將啟用此腳本,使其冗長並將其輸出寫入文件,以便您可以更輕鬆地確定是什麼絆倒了它。
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
保存文件描述符,以便它們可以恢復到重定向之前的任何內容,或者使用它們自己輸出到以下重定向之前的任何內容。 2.
trap 'exec 2>&4 1>&3' 0 1 2 3
恢復特定信號的文件描述符。通常不需要,因為它們應該在子 shell 退出時恢復。 3.
exec 1>log.out 2>&1
將 stdout 重定向到文件 log.out,然後將 stderr 重定向到 stdout。請注意,當您希望它們轉到同一個文件時,順序很重要。在將 stderr 重定向到 stdout 之前,必須重定向 stdout。