카테고리 보관물: Tools & Tips

HHKB Fn+ESC suspend 진입 방지

Linux에서 Happy Hacking Keyboard의 Fn key를 누르고 있다가 실수로 ESC key를 눌러서 Fn + ESC 조합이 되어 sleep에 진입하는 경우가 종종 있는데, 한 참 작업하는 중에 컴퓨터가 sleep에 들어가 버리면 흐름이 다시 잡기가 여간 힘들다.

Fn+ESC는 WakeUp에 해당하는 Keycode 값(151)이 keyboard로 부터 올려지는 것이어서 상위단에서 이 상황을 따로 구분해 주기는 어렵다. HHKB의 DIP switch를 변경해 주거나 해당 키를 처리하지 않도록 환경 설정을 해주어야 하는데, DIP switch를 변경하면 다른 설정이 영향을 받을 것 같아서 환경 설정으로 수정해 보기로 했다.

Fn+ESC에 의해 발생되는 sleep key는 먼저 logind에서 처리되고 Window manager (GNOME)에 전달되는데, logind에서 이 키를 받았을 때 무시하도록 하려면 다음과 같이 /etc/systemd/logind.conf를 수정해 준다.

/etc/systemd/logind.conf


HandleSuspendKey=ignore
HandleSuspendKeyLongPress=ignore
HandleHibernateKey=ignore
HandlePowerKey=ignore
HandlePowerKeyLongPress=ignore
HandleRebootKey=ignore

GNOME 추가 수정

Hyprland를 사용하는 경우에는 위의 설정만으로도 되지만, GNOME은 추가로 전원에 관련된 동작을 수정해 주어야 한다. Terminal에서 gsettings의 전원 동작을 아래와 같이 설정해 준다.

gsettings set org.gnome.settings-daemon.plugins.power power-button-action 'nothing'
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-type 'nothing'
gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-battery-type 'nothing'

이제 시스템을 재부팅하고 Fn+ESC를 누르면 해당 키가 무시되어 suspend에 진입하지 않게 된다.

Shell drop이 되지 않을 때 원격서버 재시동

원격 서버의 시스템 노드가 망가졌거나 과도한 task 실행으로 ssh로 접근할 때 제대로 shell을 drop하지 못하는 경우가 종종 생긴다.

ssh는 원격 서버에서 실행할 명령어를 인자로 받을 수 있지만 ls같은 단순한 명령어와는 달리 reboot 명령어를 수행하려면 sudo 권한을 접근하기 위한 비밀번호 입력을 필요로 한다.

비록 ssh가 “Secure SHell”이라고는 해도 일반적인 shell처럼 상호작용을 위한 비밀번호 입력 창을 대기해 주지는 않는다.

오류 메세지를 보면 다행히도 sudo는 표준입력으로 부터 비밀번호를 읽어 들이는 -S 옵션을 지원한다. 따라서 비밀번호를 표준출력으로 내보내는 명령어를 묶어서 함께 전송하면 관리자 권한으로 명령어를 실행할 수 있다.

# 비밀번호를 echo를 이용해서 표준출력으로 내보내고 sudo 명령어를 실행시킨다.
ssh <ssh_server> "echo <비밀번호> | sudo -S reboot"

다만, 이렇게 하면 history에 관리자 비밀번호가 노출되므로 동작한 후에는 history를 삭제해 주자.

SSH Permission denied (publickey)

주로 시스템을 설정하는 초기에 발생하는 문제인데 private key가 제대로 있고 file permission도 잘 설정 되어 있음에도 ssh 접속을 시도하면 권한 오류가 발생하는 경우가 있다.

$ ssh -T git@github.com
git@github.com: Permission denied (publickey). 

해결하는 방법은 사용하려는 private key를 ssh-add 명령어를 이용해서 ssh-agent에게 추가해 주는 것인데, 만약 ssh-agent가 동작하지 않는 상태라면 이 동작에도 오류가 발생한다.

$ ssh-add ~/.ssh/my_private_key 
Could not open a connection to your authentication agent.

이와 같은 인증 agent 관련한 문제가 생길 때는 ssh-agent를 실행해서 나오는 결과물을 화면에 붙여 넣으면 된다.

# SSH-agent를 실행하면 환경변수 값들이 화면에 출력된다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;

# 이것들을 그대로 화면에 붙여넣고
$ SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;
Agent pid 3261

# ssh-add를 시도한다.
$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

그런데 복붙하는 건 너무 번거로우니까 eval command를 사용해서 ssh-agent의 결과물을 그대로 수행하도록 하면 복붙한 것과 동일한 효과를 낼 수 있다.

$ eval `ssh-agent`
Agent pid 4416

$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

매번 로그인 할 때 마다 반복 하는 건 귀찮으니까 .bashrc 같은곳에 넣어두자.

#.bashrc
...
eval `ssh-agent`
ssh-add ~/.ssh/my_private_key

다시 로그인해서 시험해보면 permission error가 없이 잘 실행되는 걸 볼 수 있다.

$ ssh -T git@github.com
Hi litcoder! You've successfully authenticated, but GitHub does not provide shell access.