ssh auto login and AppleTerminal auto login

Computing 2009. 3. 13. 22:42

나는 동시에 여러개의 호스트에 여러개의 세션으로 접속해서 일을 하는 스타일이다.

즉, host1 에 ssh 로 접속한 터미널을 대여섯개 열고, host2 에도 대여섯개, host3 에도... 이런 식으로 작업을 한다. 그런데, 매번 터미널을 열 때마다 apple terminal 의 cmd-N 을 눌러서 ssh hostname 을 입력하고 패스워드도 입력하고 하려니 너무 힘들다. 그래서 생각한 것이 이것을 좀 더 편하게 하는 방법이 없을까 인데, AppleTerminal 의 window group 과 "설정" 을 이용하면 매우 편하게 이를 자동화 할 수 있다. Automator 를 이용하려고도 해 보았으나 Automator 가 화면의 마우스 움직임, 키보드 입력을 레코딩 하는지라 클릭 하는 지점이 정확하지 않거나 하는 사태가 발생할 경우 자동화가 불가능했다. 이런 황당할데가 -0-;;; 하도 어이가 없어서 풒=ㅂ=;; 하고 터져나오는 웃음을 참을 수 없었다.

본론으로 들어가서, 이 일을 하기 위해서는 몇가지 수고를 해야 한다.

우선, ssh 자동 로그인을 설정해 주어야 하고, 그 다음 윈도우 그룹을 설정해 주어야 하며, 설정에 있는 터미널 설정항목을 호스트 갯수만큼 만들어야 한다. 번거롭지만 앞으로 있을 편안함을 생각하면서 꾹 참고서 따라해 보자.

우선 ssh 자동 로그인부터 시작하자.



SSH auto login to remote host (without passwords)

우선 모든 일의 시작인 man 을 해 보도록 하자.

$ man ssh

...
     Public key authentication works as follows: The scheme is based on public-key cryptography,
     using cryptosystems where encryption and decryption are done using separate keys, and it is
     unfeasible to derive the decryption key from the encryption key.  The idea is that each user
     creates a public/private key pair for authentication purposes.  The server knows the public
     key, and only the user knows the private key.  ssh implements public key authentication proto-
     col automatically, using either the RSA or DSA algorithms.  Protocol 1 is restricted to using
     only RSA keys, but protocol 2 may use either.  The HISTORY section of ssl(8) contains a brief
     discussion of the two algorithms.

     The file ~/.ssh/authorized_keys lists the public keys that are permitted for logging in.  When
     the user logs in, the ssh program tells the server which key pair it would like to use for
     authentication.  The client proves that it has access to the private key and the server checks
     that the corresponding public key is authorized to accept the account.

     The user creates his/her key pair by running ssh-keygen(1).  This stores the private key in
     ~/.ssh/identity (protocol 1), ~/.ssh/id_dsa (protocol 2 DSA), or ~/.ssh/id_rsa (protocol 2
     RSA) and stores the public key in ~/.ssh/identity.pub (protocol 1), ~/.ssh/id_dsa.pub (proto-
     col 2 DSA), or ~/.ssh/id_rsa.pub (protocol 2 RSA) in the user's home directoryThe user
     should then copy the public key to ~/.ssh/authorized_keys in his/her home directory on the
     remote machine.  The authorized_keys file corresponds to the conventional ~/.rhosts file, and
     has one key per line, though the lines can be very long.  After this, the user can log in
     without giving the password.

좋다. 그럼 한번 해 보자.

  1. 우선 ssh-keygen 으로 rsa key pair 를 생성한다 :

    shawn.ygdrasil:~$ cd .ssh/
    /Users/shawn/.ssh
    shawn.ygdrasil:~/.ssh$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/shawn/.ssh/id_rsa): <입력하지 않음>
    Enter passphrase (empty for no passphrase): <입력하지 않음>
    Enter same passphrase again: <입력하지 않음>
    Your identification has been saved in /Users/shawn/.ssh/id_rsa.
    Your public key has been saved in /Users/shawn/.ssh/id_rsa.pub.
    The key fingerprint is:
    5f:42:cb:ca:22:9d:75:e3:e5:d5:91:6b:4d:de:1b:4e shawn@ygdrasil.****.local
    The key's randomart image is:
    ....
    shawn.ygdrasil:~/.ssh$ ls
    id_rsa       id_rsa.pub   known_hosts

  2. 이제, public key 와 private key 가 생성되었으니 그 다음 단계로 private key file 의 권한을 소유자만 접근할 수 있는 권한으로 바꾸어 준다. private key file 이 소유자 말고 타인이 접근할 수 있는 권한으로 설정되어 있을 경우 그 파일을 무시하기 때문이다. 생성할 당시 0600 으로 권한이 설정되어서 생성될 것이니 확인하는 것만으로 충분하다.

  3. 이젠 public key 를 접속하고자 하는 원격 호스트의 자신의 홈디렉토리 아래에 있는 .ssh 디렉토리에 복사해 넣어 주되, 이름을 authorizd_key 라고 해서 넣어 주면 된다. 공개 키 파일인 authorized_key 파일의 권한은 0644 정도라도 OK 이다 :

    shawn.ygdrasil:~/.ssh$ scp id_rsa.pub mdw2:.ssh/authorized_keys
    shawn@mdw2's password:
    id_rsa.pub                                       100%  411     0.4KB/s   00:00   
    shawn.ygdrasil:~/.ssh$ ssh mdw2 --> 확인해 보자.
    ....
    Last login: Fri Mar 13 21:00:23 2009 from ygdrasil.****.local
    shawn.mdw2:~$ exit --> OK!
    logout
    Connection to mdw2 closed.
    shawn.ygdrasil:~/.ssh$ scp id_rsa.pub v880:.ssh/authorized_keys
    shawn@v880's password:
    id_rsa.pub                                       100%  411     0.4KB/s   00:00   
    shawn.ygdrasil:~/.ssh$ ssh v880 --> 또 확인
    ....
    Last login: Fri Mar 13 21:14:01 2009 from ygdrasil.****.local
    shawn.v880:~$ exit --> OK!
    logout
    Connection to v880 closed.
    shawn.ygdrasil:~/.ssh$


둘 이상의 호스트에서 하나의 ssh 서버에 접속할 경우에는?

서버의 ${HOME}/.ssh/authorized_keys 파일의 뒤에 public key를 이어서 붙여 주면 된다:

shawn.ygdrasil:~/.ssh$ cat id_rsa.pub >> authorized_keys


AppleTerminal Window Groupping

이제 ssh 자동 로그인은 설정이 완료 되었다. 그럼 이제 애플 터미널의 설정창(configuration pane)을 열어서 필요 없는 창 설정들을 깔끔하게 지워 보자. 아래 그림과 같이 :


그리고 나서, 자신이 사용하는 설정을 복사해서 새로운 설정을 하나 만든다 :


그 후 새로 만든 설정의 이름을 접속하고자 하는 호스트 이름 (아무 이름이나 상관 없지만, 그래도 호스트이름과 같으면 구별하기 쉬우니까) 으로 바꾸고, 원래 터미널 창을 화면 아래쪽의 기본 버튼을 눌러서 기본 설정으로 바꿔 준다 :


그리고, 쉘 탭을 클릭해서 실행할 명령어를 해당 호스트로 ssh 를 하도록 설정해 준다 :


그리고, 현재 열려있는 AppleTerminal 의 창을 모두 닫자. 왜냐하면 윈도우 그룹을 만들 때 그룹에 포함시킬 윈도우를 선택적으로 지정하는 기능이 AppleTerminal 에는 없기 때문이다. 여기서 또 불평을 하고 싶지만 (터미널 창 단축키와 관련해서 단축키 숫자가 꼬이는 버그와 기능부족) 그냥 넘어가자. 아무튼, 모든 창을 닫은 후에, 한 호스트에 한꺼번에 접속하고 싶은 ssh 세션 수 만큼 창을 열고 화면에 적절하게 배치하도록 하자. 아래는 이렇게 한 후의 내 화면의 스크린샷이다 :


조금만 참자. 이제 거의 다 되어 간다.

그리고, 각각의 창을 클릭해서 방금 만든 설정 (내 경우에는 mdw3) 으로 설정을 바꾸어 준다. 이는 위 스크린샷에서 보이는 윈도우 1번, 2번, 3번, 4번 모두를 돌아가면서 각각 해 주어야 한다. 속성 창은 cmd-I 를 누르면 뜬다 :


마지막으로 이 윈도우 그룹을 저장한다 :

터미널 메뉴의 "윈도우 --> 윈도우를 그룹으로 저장..." 메뉴를 선택하고, 적절한 이름 (나는 mdw3 으로 하였음) 을 넣어주면 된다. 그리고, 다시 cmd-, 를 눌러서 설정 창(configuration pane)을 열고, 방금 저장한 윈도우 그룹이 윈도우 그룹 설정 창의 그룹 목록에 나타나는지 확인하자. 목록에 있다면 성공.

의도한 대로 잘 되는지 확인하기 위해 현재 열려있는 윈도우들을 모두 닫고, 터미널 메뉴의 "윈도우 --> 윈도우 그룹 열기" 메뉴를 눌러 보자. 방금 저장한 윈도우 그룹의 이름이 보인다. 누르자! 방금 그룹에 지정했던 윈도우들이 한꺼번에 뜨면서 의도했던 대로 ssh 로 설정한 호스트에 자동으로 로그인까지 된 상태로 나온다 :



그럼 이제 이것을 응용해서 다른 호스트들에 한꺼번에 접속하는 터미널 띄우기, 혹은 한 호스트에 한꺼번에 접속하는 터미널 그룹 띄우기가 가능하게 되었다.

그런데, 이처럼 한 호스트에 접속하려고 설정을 할 때마다 번거롭게 위의 과정을 반복해야 할까?

그럴 필요는 없다.

AppleTerminal 의 설정 창(configuration pane)을 띄워서 그룹 탭을 보면 아래쪽에 조그마하게 명령어 드롭다운 박스(?)가 보인다. 그걸 눌러 보면, "보내기" 메뉴가 눈에 띈다. 눌러 보면, 그룹의 설정을 파일로 내보내는 기능임을 알 수 있다. 파일 이름을 입력하고 파일로 그룹설정을 저장해 보자.


그리고, 자기가 선호하는 에디터로 방금 저장한 파일을 열어 보자. 알고 봤더니 plist xml 파일이다. 파일을 곰곰히 살펴 보면 각각의 윈도우의 좌표는 물론이요, 설정도 모두 조작할 수 있게끔 되어 있다. 그럼, 아까 설정했던 ssh 명령을 실행하는 부분을 찾아 보도록 하자. 이 항목은 CommandString 키 아래 String 값으로 설정되어 있다 :

                        <key>CommandString</key>
                        <string>ssh mdw3</string>

그럼, 이 파일을 이름만 바꿔서 복사한 다음 저 ssh [hostname] 을 한번 다른 호스트 이름으로 바꾸어 줘 보자.

그 뿐만 아니라 파일에 있는 name 키, Tab Settings Name 키도 바꿔 주어야 한다. 이 값들은 여러분이 이리저리 바꿔 가면서 실험해 보도록 한다. 아무튼, 나는 새로운 접속 윈도우의 그룹을 만들고자 하는 호스트 이름인 v880 으로 모두 바꾸었다.

그리고, 위 그림에서 볼 수 있듯이 AppleTerminal 의 설정창을 열어서 윈도우 그룹 탭에서 가져오기를 선택해서 방금 복사한 파일을 가지고 온다.

그리고 다시 터미널의 "윈도우-->윈도우 그룹 열기" 메뉴를 선택하면, 새로운 그룹인 v880 이 눈에 띌 것이다. 눌러 주면 창이 마구 열리면서 자동으로 v880 에 접속되어 있는 것을 볼 수 있다. 그리고, 설정 창의 설정 탭에 새로운 v880 이라는 설정이 눈에 띌 것이다. 내가 설정을 새로 만들지 않았는데도 터미널이 새로운 설정이라고 인식하고 자동으로 생성해 준 것이다. 정말 마음에 안든다. 아무튼 이 내용들을 응용해서 여러개의 창을 각각 다른 호스트에 접속하도록 설정해 두고 편하게 사용할 수 있을 것이다.

이것저것 테스트해 보면 꼬이거나 하는 부분, 이상하게 동작하는 부분들을 찾을 수 있을 것이다. 아무튼, 그런 부분들은 지혜롭게 잘 피해서 가장 작업 효율을 높일 수 있는 설정을 해 놓고 즐겁게 사용하시길 바란다.


: