LinuxのGUIで複数タブ又は複数ウィンドウ(別セッション)で端末を開きつつ、各画面で臨機応変にサーバーにSSH接続する場合(どんな仕事だ…)、SSH接続をexpectのワンライナーでalias登録すると素早さが増しますが、躓いた部分があったので解説します。
aliasでシングルクォーテーションをエスケープする方法
bashでシングルクォーテーションをエスケープするには「\」=バックスラッシュ(日本語環境では¥マーク)を使用しますが、シングルクォーテーションの中のシングルクォーテーションには使えません。aliasコマンドは、登録するコマンドをシングルクォーテーションで囲む必要がありますが、expectをワンライナーで登録する場合、その内部にシングルクォーテーションを使う場面が出てきます。
この場合、一旦シングルクォーテーションを区切る意味で、「'\'」を使用します。
bad!!
alias 'a1=expect -c \'spawn .....\''
good!!
alias 'a1=expect -c '\''spawn .....'\'''
.bashrcを更新する方法
aliasコマンドでaliasを登録した場合、別セッション(=GUIでは端末の別タブ・別ウィンドウ)を開く場合、aliasを引き継いでくれません。別セッション立ち上げ時はユーザー・ホームディレクトリにある.bashrcを読み込むので、ここにaliasを記載しておけば事足ります。(OSによっては、.bash_aliasesへの記載が推薦されていることもあります)
しかし、
- 毎回ログインするサーバーが違う
- サーバーが不定期にクリーンアップされる
場合、.bashrcを編集するのは不適切です。そこで、aliasで登録した後、aliasの内容を.bashrcにリダイレクトしてやると、それ以降の端末起動時にも読み込ませることができます。
alias >> ~/.bashrc
前回alias登録済みで、重複があった場合、aliasのショートカットが上書きされるだけなので、.bashrcが無限増殖することはありません。
上記2つをまとめてワンライナーで
さらに、サーバー上に設定ファイルが置けない、毎回ログインするサーバーが不定の場合、alias登録から.bashrc更新までワンライナーで記載して、端末へコピペするとその後の作業が楽になります。
例として、複数のサーバーログインショートカットを作成し、.bashrcを更新するワンライナースクリプトを示します。
alias at='expect -c '\''spawn ssh -o UserknownHostsFile=/dev/null -o StrictHostKeyChecking=no username@192.168.0.1; expect "assword"; send "password\r"; interact'\''';alias ax='expect -c '\''spawn ssh -o UserknownHostsFile=/dev/null -o StrictHostKeyChecking=no username@192.168.0.100; expect "assword"; send "password\r"; interact'\''';alias >> ~/.bashrc;
これで、sshでパスワードを打っている隣の同僚を、置いてけぼりにすることができるでしょう!
0 件のコメント:
コメントを投稿