みま

満員電車つらい

学校へのSSH接続を自動化した

はじめに

 僕はよく学校へSSH接続を行い、そこからプログラミングの課題をやったり提出したりしている。
 その際にいちいち長いコマンドを打ち、パスワードを入力して接続するのは少々面倒だったので自動化することにした。

expectによる実装

  • そもそもexpectってなんぞや?
  •  SSH自動化はexpectというもので出来るらしい。(他のでも出来ますがexpectが簡単で分かりやすそうだった)  調べたらexpectとは対話的なプログラムとのやりとりを自動化するプログラムらしい。 今回の場合、向こうからパスワードを聞かれた時それに対して人間がパスワードを入力するがこれを自動化してくれる。
  • とりあえずスクリプトを書いてみた
  • 以下の記事を参考にした。 qiita.com

    #!/usr/bin/expect
    
    set timeout 10
    #ssh ユーザ名@ホスト名
    spawn ssh username@sshgate.u-hatena.ac.jp
    expect "Password: "
    send "ThisIsMyPasswd\n"
    interact
    

    sshという名前のディレクトリを作ってそこでssh_school.shというファイル名に書いた。

    #!/usr/bin/expect
    これはそのスクリプトを動かすシェルの宣言。#でコメントアウトしているように見えるがこれがないと動かない。

    set timeout 5
    タイムアウトする秒を指定しています。
    デフォルトだと10秒だがそれだと長いので5秒にしてある。

    spawn ssh usename@sshgate.u-hatena.ac.jp

    実行したいコマンドを指定。
    要するにspawnで指定したコマンドが自動化するコマンドです。
    この場合@の前にユーザ名、@の後にホスト名を入れる。

    expect "Password: "
    expectスクリプトで、相手からの応答(ダブルクォートで囲まれた文字列)を読み取り、パターンマッチをする時に利用します。
    この場合向こうから「Password: 」とパスワードを聞かれた場合の文字列である。

    send "ThisIsMyPasswd\n"
    相手に文字列を返答するコマンドです。
    これは"ThisIsMyPasswd"と自分のパスワードを打ってから\nでエンターを入力したという意味だ。

    interact
    標準入出力をキーボードと画面にします。

    スクリプトを書き、そのまま実行しようとしてもパーミッションなんちゃらがでるので
    $ chmod u+x ssh_school.sh
    で実行権限を付与。

    $ ./ssh_school.sh
    で見事SSH自動化に成功。これを叩くだけでパズワードを入力する手間をかけずに学校にSSH接続できた。やったね!

    その後、自分はzshを使っていたのでzshの環境設定ファイル.zshrcに以下のようなのを追加した。

    #.zshrc
    alias sshs='~/ssh/ssh_school.sh'
    

    でaliasを貼り、これで長いコマンドを打たなくて済み、尚且つどこの場所にいても"sshs"と叩けば学校へのSSHが出来るようになった。

最後に

今回の一つ前に投稿したのが去年の12月。3ヶ月間ブログで書く事がなくてやっと見つけた話題。これからも続けられるか心配だがモチベを上げてやっていこうと思う。