SSHポートフォワーディング
便利ですね。普通はこんな具合にSSHコマンドを立ち上げっぱなしにすると思います。
$ ssh www.example.com -fNL 8000:localhost:8000 # -Lでポート指定、-fNでバックグラウンド待機
$ mycommand foo bar # ポートフォワーディングが必要なコマンドを実行する
mycommandの出力:fooをbarしちゃうにゃん
$ mycommand hoge fuga # SSH起動中はポートフォワーディングが持続する
mycommandの出力:hogeをfugaしちゃうにゃん
...
さて、特定のコマンドを実行する間だけポートフォワーディングしたいとします。ナイーブにやるならこうなりますね。
$ ssh www.example.com -NL 8000:localhost:8000 &
[1] 4273
$ mycommand foo bar
mycommandの出力:fooをbarしちゃうにゃん
$ kill 4273
[1]+ Done ssh www.example.com -NL 8000:localhost:8000 &
これではタイプしている間に宇宙が熱的死を迎えてしまいます。
まずは関数化
とりあえず面倒な部分を設定ファイルにまとめます。
~/.ssh/config
Host example
HostName www.example.com
LocalForward 8000 localhost:8000
~/.bash_profile
function spf() {
ssh $1 -N & # $1はサーバ名
pid=$! # SSHのプロセスIDを保存する
shift # $2以降はコマンドとその引数
$@ # コマンドを呼び出す
kill $pid # SSHポートフォワーディングを止める
}
これでsshでリモートのコマンドを実行するようなノリで使えるようになりました。
$ spf example mycommand foo bar
[1] 42365
mycommandの出力:fooをbarしちゃうにゃん
[1]+ Done ssh example -N &
コマンドの出力の前後に余計なメッセージが出ちゃいますねえ。ぐんにょり。
余計なメッセージを消す
コマンドの前後のメッセージは、バックグラウンドジョブの起動と終了のメッセージです。これらを非表示にする処理を追加すれば…
~/.bash_profile
function spf() {
set +m # バックグラウンドジョブの終了メッセージを非表示にする
{ ssh $1 -N & } 2> /dev/null # バックグラウンドジョブの起動メッセージを消す
pid=$! # SSHのプロセスIDを保存する
shift # $2以降はコマンドとその引数
$@ # コマンドを呼び出す
kill $pid # SSHポートフォワーディングを止める
sleep 0.01 # ジョブ終了メッセージが出ないように少し待ってから
set -m # 終了メッセージの表示設定をもとに戻す
}
🏆🏆🏆 優 勝 🏆🏆🏆
$ spf example mycommand foo bar
mycommandの出力:fooをbarしちゃうにゃん
謝辞
バックグラウンドジョブの起動メッセージを消す方法は、ひよどりBasistさんに教えていただきました。ありがとうございます。
{ sleep 100 & } 2> /dev/nullちょっと違うかも— ひよどりBasist (@VisualBasist) April 22, 2021
↧