Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2819

コマンド実行中だけSSHポートフォワーディングを有効化する

$
0
0
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

Viewing all articles
Browse latest Browse all 2819

Trending Articles