以下の内容はhttps://let.blog.jp/tag/sshより取得しました。


ssh が切れても後段の ssh は残ってる
ローカル

サーバー A → サーバー C

サーバー B

こんな感じで A を通して B や C に ssh で接続しています

ssh 接続したまましばらくすると自動で切断されてることがあります
broken pipe みたいなエラーが表示されるやつです

接続してることを完全に忘れてることもあるので長時間なら切断されることは別にいいのですが 予想外のところで問題がありました

ローカル → サーバー A

ここの接続は切れているのに

サーバー A → サーバー B

の接続は維持されてるようです
ps でプロセスを見ると ssh 接続されています

また サーバー B にログインした状態で less やプログラミング言語の REPL などインタラクティブなものを使っているとそのプロセスも残っています
psql や mysql コマンドを使ってると DB とのコネクションが残ります
これは色々と問題です
ファイルを開いたままになっていたり メモリをずっと確保したままになっていたり

とりあえず ps でプロセスリストを見て それらしいものを kill していきます
困るのがどれがどれかわからないのですが ps の STAT 列に + がついているプロセスはフォアグラウンドプロセスグループに属してるらしいのでこれを目印にできます
ログインしてユーザーが操作してコマンドを実行すればフォアグラウンドなので + がついてるもので現在ログインして操作中でなければ kill していいはずです
自分しかログインしない環境なら簡単です

でも根本的な解決としてプロセスが残ってほしくないんですよね
A の ssh 接続設定にタイムアウトを入れる感じでしょうか
tmux とか入れれるならそれを使えば セッションを復元できますが 踏み台用途のところはあまり色々インストールしたくないのと tmux 系は不便もあるのであまり使ってないんですよね
ホストのフォルダをマウントしてない Docker コンテナからデータをコピーしたい
なにかを試すときに一時的なコンテナを作ってそこで作業してることがよくあります
そこで作ったものを Windows 側で使いたいなんてことがときどきあります
Windows 側とまで行かなくてもホスト側の WSL に持ってきたいこともあります
また逆に Windows 側で用意したファイルをコンテナで使いたかったりします

それを見越して とりあえずで docker run するときにカレントディレクトリをコンテナの /mnt にマウントするようにしてるのですが 時々忘れます
そして忘れたときに限ってコピーしたくなったりするものです
コンテナを作り直してもいいのですが 色々パッケージをインストールしたり 環境の設定を変えたりしているともう一度やり直しは面倒です
その時点のコンテナをイメージ化してそこからコンテナを作るという方法もとれますが 一時的なもののためにイメージ化するのも面倒です
それならコンテナを作り直しでもいいかなと思うくらい

ただやっぱり面倒なのでいい方法がないかなと考えていてふと思いつきました
WSL で sshd サーバーを起動しよう
コンテナから WSL には通信できるので scp でコピーできます
やってみると簡単にできました

sudo apt install openssh-server
sudo service ssh start

という感じです
sshd が入ってなければ sshd のインストールとサービスの起動をします
あとはコンテナから

scp file.txt user@172.21.76.78:

みたいな感じに使います

user は WSL のユーザー名で 172.21.76.78 は WSL の IP アドレスです

WSL まで持ってきたら Windows からは \\wsl$\... のフォルダでアクセスできるので扱いやすいです



以前使ってた方法

◯ http

ウェブサーバーを起動して GET/POST で通信してました
ウェブサーバーは扱いやすいですし GET だけなら python3 がデフォルトで入ってるので http.server モジュールの起動だけで使えるなど楽でした
しかし POST で保存するとなると面倒ですし GET に揃えると送りたい側でサーバーを起動しないといけないです
また フォルダをコピーしたいときには zip 化するなど一手間が必要でした
コンテナ環境だと zip の操作コマンドも入ってなかったりしますし

◯ cifs mount

フォルダのコピーなら共有フォルダがあると便利です
ただ Linux の cifs マウントって結構面倒ですし 頻繁にセットアップ時にうまく行かなくてググってます
オプションも覚えづらくて毎回ググる必要があります

Windows と Docker コンテナ間が直接通信できたらこれでもいいのですが ネットワークが違うので Windows ←→ WSL と WSL ←→ コンテナでしか通信できないです
それなら ssh を通して scp 等のコピーのほうが手軽だと思います



書いた後で思い出しましたが そういえば docker コマンド内にも cp みたいなのがあった気がします
コンテナ内からのコマンドで実行できませんが もうひとつ WSL ウィンドウを開いてホスト側から操作する場合はこっちでもいいかもしれません
TortoiseGit で OpenSSH の鍵を使う
久々に TortoiseGit が入ってる PC でリポジトリを追加しようとしたのですが TortoiseGit は Putty の鍵を要求するので OpenSSH の鍵を変換する必要があり面倒です 
OpenSSH をクライアントに使えないのか調べると設定できました

右クリックメニューから Settings を選んで設定ウィンドウを出して サイドバーから Network を選択
パネル内の 「SSH client」 に OpenSSH の ssh.exe のパスを設定する
最近の Windows10 では標準で OpenSSH クライアントが入ってるのでこれを設定

C:\Windows\System32\OpenSSH\ssh.exe

これでクライアントの切り替えができました

次は鍵の設定ですが 「Git > Remote」 にあるリモートの設定は 「Putty Key」 となっていて OpenSSH 用のキーのパスを入れてもダメでした
個別設定はできないみたいなので デフォルトの鍵の配置場所に配置します
ホームフォルダ内の .ssh フォルダ内に id_rsa という名前で配置します
これで問題なく通信できるようになりました

ただ この設定はリポジトリごとではなく全体設定なので 既存リポジトリではこれまでのクライアントで個別に設定した鍵を使いたいという場合には使えなさそうです
sshd のデフォルトで root ログインできない
root でログインしようとしたら何度パスワード打っても失敗と言われる
別のと間違ってる?と思って一般ユーザでログインしてから su コマンドで root のパスワード打つと root でログインできてる

デフォルトで root 拒否されてたっけと思い調べてみたら

PermitRootLogin prohibit-password

がデフォルトみたい
https://man.openbsd.org/sshd_config#PermitRootLogin

これだとパスワードログインが無効化されて鍵ファイルを使った認証が必要
昔は普通に yes だった気がするから変わったのかな

root ユーザのみだと鍵ファイル配置か設定変えるまで 外部からログインできないの不便そう
ssh 鍵作る
秘密鍵と公開鍵

ssh-keygen -t rsa

Windows のソフト用 ppk

puttygen id_rsa -O private -o id_rsa.ppk

WSL (Ubuntu) の場合の puttygen インストール

apt install putty-tools
EC2 サーバの ssh 接続を自動切断されないようにする
サーバ側で自動切断設定してるのかと sshd の設定を切断されないローカル VM と見比べても特に違いはなし

調べても日本語の個人サイトでは人によって書いてることが違ってどれが正しいかわかりません
設定は Server と Client どっちでもいいと書いてたり 理由や説明もなく動いたからと貼り付けてるだけでよくわからなかったので StackOveflow に行くといい回答がありました
やっぱり技術系の調べ物は英語のほうがいいですね

https://stackoverflow.com/questions/7210011/amazon-ec2-ssh-timeout-due-inactivity

EC2 サーバの設定ではなく AWS が一定時間通信がないと自動で切断するようです
それも リージョンによって間隔が違って短いと 1 分の通信なしで切られるそうです
ということで 50 秒ごとにサーバと疎通確認の通信を送っていればサーバから通信がないからと切断されることがなくなるようです

ServerAliveInterval 50

これをクライアントの ~/.ssh/config に追記します




以上の内容はhttps://let.blog.jp/tag/sshより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14