/*Google AdSense自動広告*/

2021年1月3日日曜日

bashのaliasでexpectを登録→シングルクォーテーションをエスケープし、別セッションでも有効にする方法

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 件のコメント:

コメントを投稿