ローカルのlinuxへの接続やgoogle cloudへの接続では、windowsからはtera termのマクロを書いておいて、それを使って接続している。
macはunixなのでtera termが動くわけじゃない。
でもログインしたときに慣用句みたいに打つ内容があるから、自動ログインした後で打鍵もやらせたい。
dfの結果とか、自前スクリプトによるプロセス稼働確認とか。
今回はmac側でやったことの記録。
結論
macで.terminal
のファイルをクリックすると、tera termでttlファイル書いておいたときのように、linuxに接続してコマンドラインを自動入力して動いてくれるようにしてる。
ローカルlinuxの場合、黄色い画面色で開いてログインし接続後にonlchk
ってやって自前スクリプトを呼び出し、システム状態を表示させてる。
色合いとか調整した設定を.terminal
って種類のファイルとして書き出し、それをクリックすることで自動接続&打鍵のスクリプトを呼び出している。
このスクリプトは大昔に作ったんやけど、当時に参考にさせてもらったサイトがどこなのかわからん。もう存在しないのかなぁ。探し方悪いだけかもしれん。
用意してるのは3種類のファイル。
当初はlinuxの種類に応じて色を変えたいだけだったけど、欲張って自動ログインとシステム状態確認をやらせたくなった。
.terminal
の設定ファイル- autologinってログインのための入力内容
- 呼び出しのスクリプト
.terminalの設定ファイル
設定ファイルは、ダブルクリックすると設定した色合いやサイズ、シェルが起動する。
tera termでいう/Fで指定するウィンドウの色とか指定するときのファイルみたいなもんか。
このファイルは、ターミナルの環境設定を開いたとき「プロファイル」の画面が開くとこから作る。
テキストの色とかウィンドウサイズを設定し、「コマンドを実行」ってとこで起動時に呼び出すシェルを指定する。
自分の場合は、赤がgoogle cloud、黄色をローカルlinux、dockerコンテナを青か緑にしてtera termの色設定しているので、それに寄せて設定を作っている。
エコーバックに対する文字列送信のスクリプト
tera termでいうttlファイルみたいなもの。
autologin-xxx.shってのをいくつか用意して、ローカルlinux用とgoogle cloud用とか使い分けてる。
実際は.terminal
で設定した起動時の呼び出しスクリプトから最初にインクルードさせて使う。
autologinで始まるシェルに引数を受け取りつつ、打鍵内容を書いておく。
パラメータは、接続先ホスト、利用osユーザ、パスワード、ポート番号。
コマンドラインのエコーバックに来た文字列をexpectに書いておき、それに対する送信文字列をsendさせる。
最初のほうにある「Are you sure~」のあたりは初めてログインするときの確認エコーバック。
長らくこのエコーバック見てないけど、大文字小文字も厳密に書かないといけない。
#!/bin/sh
auto_ssh() {
host=$1
id=$2
pass=$3
ptNum=$4
ptTime=10
expect -c "
set timeout ${ptTime}
spawn ssh ${id}@${host} -p ${ptNum}
expect \"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\n\"
expect \"${id}@${host}'s password:\"
send \"${pass}\n\"
} \"${id}@${host}'s password:\" {
send \"${pass}\n\"
expect \"nari\"
send \"onlchk\n\"
expect \"nari\"
send \"df -h\n\"
}
interact
"
}
montereyになった今ではnari@gvisMac ~ %
って感じで「利用ユーザ@ホスト名 ホームディレクトリ」がコマンドライン待ちに来るけど、ユーザ名のみをexpectさせてonlchk
とdf -h
って打たせたいので書いてる。
接続先は、大昔はsolarisとかcentosやったこともあったけど、今はubuntuなのでexpectとsendは微妙に変えていかないといけない。
ホスト名はOSの世代ごとでも少しずつ変わってくることがあるし、書き換えるの面倒なのでホスト名なんかはexpectに書かない。
onlchkは自分用のシステム状態確認コマンド。
詳細は別で書く。
実行するためのスクリプト
ローカルlinuxの.terminal
から呼び出される。
さっきの「エコーバックに対する文字列送信のスクリプト」を読み込んで、その中のauto_sshに4つの引数を書いて呼び出す。
#!/bin/sh
# エコーバックに対する文字列送信のスクリプト処理の読み込み
. autoLogin-onlchk.sh
# 自動ログインを実行
auto_ssh '172.16.17.118' 'nari' 'xxxxxxxxxx' 22
ここまでは昔参考にさせてもらったサイトをベースにして作ってある。
macがsnow lepardの頃からずっと使ってる秘伝のタレみないなものなので、めっちゃ安定稼働してる。
google cloudの場合
google cloudへの接続は最初はvpn接続してたけど、今はグローバルIPを1つ確保して直接つないでる。
パスワードつきの鍵ファイルを作って使ってるから、そういうふうにスクリプトを書き足して使ってる。
起動時のシェル指定も変えてる。
起動時のシェルは、接続先のホスト名変えてるだけ。
#!/bin/sh
# エコーバックに対する文字列送信のスクリプト処理の読み込み
. autoLogin-gcp-onlchk.sh
# 自動ログインを実行
## auto_ssh '172.16.17.118' 'nari' 'xxxxxxxxxx' 22
auto_ssh 'gcp-nadklinuxdirect.intra.gavann-it.com' 'nari' 'xxxxxxxxxx' 22
自分の環境はyamahaのルータ(rtx1210)にdns機能を有効にさせて、ホスト名で固定IPの名前解決ができるようにしてるからこの書き方できちっと動く。
#!/bin/sh
auto_ssh() {
host=$1
id=$2
pass=$3
ptNum=$4
ptTime=10
expect -c "
set timeout ${ptTime}
spawn ssh ${id}@${host} -p ${ptNum} -i /Users/nari/Documents/personal/script/terminal/key/20220102key-nari
expect \"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\n\"
expect \"${id}@${host}'s password:\"
send \"${pass}\n\"
} \"20220102key-nari': \" {
send \"${pass}\n\"
expect \"nari\"
send \"onlchk\n\"
expect \"nari\"
send \"df -h\n\"
}
interact
"
}
エコーバックに対する文字列送信のスクリプトでは、sshするときに-i
で鍵ファイル指定する。
鍵ファイルに対するパスワードを聞いてくるから、それに対するsendをつけておく。鍵ファイル作るときにパスワードつけてないときはこのsendは不要。
tera termマクロのほうが楽かも
macからどうしてもできないのは、dockerコンテナとして作ったcentos7/8にssh接続できない。
dockerコンテナやから同じホストで別ポートからsshを提供していると、macの.sshフォルダに入るfingerprintが違っててアカンでって警告して止まる。
警告して止まってまうのを、警告無視して続行させられたらつながるかもしれん。
これはtera termの場合でも似たような警告が表示される。
「わかっとるっちゅーねん」と思いながら、tera termの警告を無視して「続行」すれば接続できる。
macでも警告無視して続行できる方法があるのかもしれんけど、代わりに普通にローカルlinuxに接続してdocker exec
して回避すればいい。
やっぱsshの鍵関連は面倒やなぁ。
tera termでやるほうがこのへんは楽。
接続できへんのは、dockerコンテナやVMを作り直したりすることでfingerprintが変わってまうから。IPアドレスとポート番号がペアで書いてあるから、viで開いて必要箇所を削除するか、量が多いならknown_hostsをファイルごと消せば作り直される。
nari@gvisMac .ssh % ll
total 24
-rw------- 1 nari staff 37 Apr 12 04:49:53 2020 config
-rw------- 1 nari staff 3474 Aug 7 06:22:20 2022 known_hosts
-rw------- 1 nari staff 2716 Aug 7 06:22:18 2022 known_hosts.old
nari@gvisMac .ssh %
先週に必要箇所を削除して、その後で接続したらちゃんとつながった。