expectでウィンドウサイズに変更があった場合に自動的にターミナルをリサイズさせる

ごくたまに、以下のようなexpectを使ったスクリプトを作ってログイン時のパスワード入力やら事前処理のコマンドやらを自動入力させることがある。

#!/bin/bash
expect -c "
  spawn ssh user@host
  expect \"s password:\"
  send \"Password\n\"
  interact
"
Sponsored Links

ただ、このようにしてログインした場合、使用中にターミナルウィンドウのサイズをいじった際に一緒にリサイズされない事がある。
「stty size」コマンドでターミナルのサイズを取得できるのだけど、ターミナルのウィンドウサイズをいじっても変化がない。

このような場合は、以下のような記述を追記してtrapでWINCHシグナル(ウィンドウサイズの変更シグナル)を受け付けた際にターミナルサイズを変更するようにしてやればいい。

#!/bin/bash
expect -c "
  trap {
   set rows [stty rows]
   set cols [stty columns]
   stty rows \$rows columns \$cols < \$spawn_out(slave,name)
  } WINCH

  spawn ssh user@host
  expect \"s password:\"
  send \"Password\n\"
  interact
"

 

Shebangをexpectとして記述する場合は以下。

#!/usr/bin/expect

trap {
  set rows [stty rows]
  set cols [stty columns]
  stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH

spawn ssh user@host
expect "s password:"
send "Password\n"
interact

 

まあ、今時普通はパスワード認証じゃなくて鍵認証だと思うので、あまり使う機会も無いような気がするけど。

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*