Ruby の net-ssh で OpenSSH 8.8 以上のサーバーにアクセスできない件

Ubuntu 22.04 LTS (Jammy) の OpenSSH 8.9 な sshd に対して、OpenSSH 7.2 以降の ssh ではアクセスできるけど Rubynet-ssh ではアクセスできない件。

理由は以下の通り。

  • OpenSSH 8.8 で ssh-rsa 署名が無効化された
  • rsa 鍵は ssh-rsa 署名の他に、rsa-sha2-256rsa-sha2-512 でも署名可能
  • 実装によっては、ネゴシエーション時に利用可能とわかれば、rsa-sha2-256rsa-sha2-512 署名を使う
    • OpenSSH は 7.2 以降で対応している
    • Rubynet-ssh は現時点の最新リリース版 6.1.0 では未対応
  • 従って、
    • OpenSSH 7.2 以降の sshrsa-sha2-512 署名を使って接続可能
    • Rubynet-sshssh-rsa 署名を使うので接続失敗

詳しい説明は、ヌーラボさんの「OpenSSHがSHA-1を使用したRSA署名を廃止、BacklogのGitで発生した問題と解決にいたるまでの道のり」とそこからリンクされているサイトを参照されたし。

Rubynet-ssh で接続するには、

これからSwitchをお迎えする人へ

年末に向け、新しく Switch をお迎えする人も多いかと思います。そんな人へ、スムーズに使い始められるようにお勧めの準備事項をまとめてみました。

(以前、某所に投稿したやつの 2021 年版です)

SDカード

ダウンロードソフトの保存先に必要なので買っときましょう。本体内蔵のは有機 EL モデルが 64GB、無印と Lite が 32GB なんであっという間にいっぱいになります。

microSDXC の 128GB 以上ならいいんでないかと。

粗悪品を掴まされないように、信頼できる販路で信頼できるメーカーのを購入しましょう。(個人的には SanDiskTranscend

ちなみにソフトの容量はこんな感じ:

  • ブレワイ: 14.4GB
  • Xenoblade DE: 13.6GB
  • スプラ2: 6.1GB
  • あつ森: 6.6GB

ニンテンドーアカウント

Switch内の「ユーザー」に「ニンテンドーアカウント」を連携させるとポイント溜まったりニンテンドーeショップでソフト買えたりできます。

ので、「ニンテンドーアカウント」は予め作っておいた方がスムーズに始められるかと。

Switch が無くても PC or スマホでここからアカウント作れます。

ちな、Nintendo Switch Online には「ニンテンドーアカウント」は必須です。

子どもアカウント

0 歳から 17 歳までのアカウントは「子どもアカウント」として登録できて、「みまもり設定」で各種制限を加えることができます。

一度「子どもアカウント」にすると 13 歳以上になるまで「一般アカウント」にすることができませんが、ボイチャ使うゲームを子どもがやらない限りはまぁ「子どもアカウント」でいいんじゃないかと思います。

Nintendo Switch Online

Nintendo Switch Online は入るのをお勧めします。

オンラインプレイだけじゃなくて、セーブデータお預かり(セーブデータのバックアップ)もできるので。

300時間のハイラルの思い出が吹っ飛んだら立ち直れませんよね?

ただ、セーブデータお預かりに対応してないゲームもあるので気をつけてください…

あとは、昔のファミコンスーファミのゲームも遊べるようになります!

個人だと 2,400 円/年。ファミリープラン(最大 8 アカウント)だと 4,500 円/年です。

NINTENDO 64 好きなら、10 月下旬に追加予定の「追加パック」も要チェック。

Proコン

必要になったらでおk

ゲームはダウンロード版?パッケージ版?

ゲームカードを入れ替えるのが地味にめんどいのでダウンロード版をお勧めします。

が、パッケージ版のメリットもあるので状況次第で。

  • 飽きたら売り飛ばしたい
  • Switchを複数台もってて、両方でプレイしたい(連携してるニンテンドーアカウントが別の場合)
  • 中古で安く買いたい
  • ご賞味したい(ゲームカードは舐めると味がします。中古の場合は抵抗ありますが…)

液晶保護フィルム

持ち運び時にキズがついたらイヤなので自分は貼ってます。

キャリングケース

持ち運ぶときにはあった方がいいかもす。

カバンに放り込んで液晶に傷がついたりスティックがぐんにゃり逝ったりすると悲しいので、かさばらないソフトケース持ってます。

あと、ケースに入れても入れなくても、持ち運ぶときは電源オフにした方がいいす! カバンの中で、スティックに何かが触れるとスリープから覚めてしばらくしてまたスリープして〜を繰り返して、さてやるか!!ってときにバッテリーが尽きてると悲しいので。(経験者)

goのtviewを使う時は、

FAQ

にも書いてあるけど、 export LC_CTYPE="en_US.UTF-8" しましょう。

じゃないと、枠線がガビガビになったり行頭の1文字が書けたりしちゃいます。

もしくは、こんな感じで環境変数をセットして再実行するのでもいいかと。

func init() {
    // https://github.com/rivo/tview/wiki/FAQ#why-do-my-borders-look-weird
    if os.Getenv("LC_CTYPE") != "en_US.UTF-8" {
        os.Setenv("LC_CTYPE", "en_US.UTF-8")
        env := os.Environ()
        if err := syscall.Exec(os.Args[0], os.Args, env); err != nil {
            panic(err)
        }
    }
}

内部NLBによるパケットの書き換えのまとめ

そういえば、内部 NLB 構成ってどうやって同一セグメントのクライアントにパケットが返ってきてるんだろ? リアルサーバーからみたときに、パケットの送信元がクライアントのになる DSR だとすると返せるのはわかるんだけど、VIP (NLBのIPアドレス) 宛のパケットを受ける設定してなくても動いてるし、NAT (DNAT) 型だとすると(クライアントが同一セグメントにいるので)戻りのパケットが NAT した NLB を経由しないんでクライアントに破棄されるだろうし??? とふと疑問を持ったので調べてみた結果です。

調べたところ、リアルサーバーに届くパケットはこんな感じでした:

  • ターゲットをインスタンスIDで指定した場合
    • src MAC = NLBのMAC
    • src IP = クライアントのIP
    • dst MAC = リアルサーバーのMAC
    • dst IP = リアルサーバーのIP
  • ターゲットをIPアドレスで指定した場合
    • src MAC = NLBのMAC
    • src IP = NLBのIP
    • dst MAC = リアルサーバーのMAC
    • dst IP = リアルサーバーのIP

まとめると:

  • 内部 NLB は NAT型 の L4LB
  • dstはリアルサーバーのMACアドレスIPアドレスに書き換えられる(DNAT)
  • srcのMACアドレスはNLBのMACアドレスに書き換えられる
    • リアルサーバーからの戻りのパケットが必ずNLBを経由するようにこうなってると思われ
    • DNATのみだと、srcはクライアントのMAC、IPになるので、リアルサーバーはNLBを経由せずに直接クライアントに戻りのパケットを送信しちゃって、クライアントは送ったのと違うところからパケットが返って来ることになるので破棄しちゃう
  • ターゲットタイプで違うのは、srcのIPアドレスのみ
  • ターゲットをインスタンスIDで指定したときの注意点

な感じでした。なるほどー

良いお年を!

MySQLで生パスワードからauthentication_stringを得る方法

SELECT PASSWORD('mypass');

mysql.user の authentication_string に格納されるのを得られるんですが、MySQL 8から PASSWORD() 関数がなくなったのでどうすればいいかというと、

SELECT CONCAT('*', UPPER(SHA1(UNHEX(SHA1('mypass')))));

こうすればいいです。

と、 @yoku0825 さんに教えてもらいました!

あるファイルがn日以上更新されてないか調べる方法

find -mtime を使う

# 最終更新から 24 時間以上経過しているか
if [[ "$(find /path/to/file -mtime +0)" != "" ]]; then
  echo 'OLD!'
else
  echo 'NEW!'
fi

-mtime +0 がなぜ「24時間以上前」になるのか?について:

-mtime n
  ファイルの最終内容更新日時が、基点となる時刻から計算して n 日前に当たれば、真を返す (訳注: 基点となる時刻は、デフォルトでは find を実行している今現在である)。
  (snip)
  なお、デフォルトの動作のように、現在時刻から数えて 24 時間前から 48 時間前までを 1 日前とする

つまり、

  • 1日前 = 24時間前から48時間前

なので、

  • n日前 = n*24時間前から(n+1)*24時間前

つまり、

-mtime 0 = 最終更新が0日前 =  0時間前から24時間前
-mtime 1 = 最終更新が1日前 = 24時間前から48時間前
-mtime 2 = 最終更新が2日前 = 48時間前から72時間前

次に n の記法について。

数値の引き数は、以下の形で指定することができる。

+n
  n より大きい。
-n
  n より小さい。
n
  ちょうど n。

なので、

  • -mtime +0
  • = -mtime 1 または -mtime 2 または ...
  • = 最終更新が0日前より過去
  • = 24時間前より過去

となる。

ほかにイケてる方法があったら教えてください!!><

これだけ覚えればOK、rsyncのディレクトリ、ファイルパスの指定方法

ディレクトリどうしをまるごとコピーしたい場合

コピー元・先両方に末尾に / をつけて、コピー先のディレクトリまで指定する。

rsync -av /path/to/dir/ remote:/path/to/dir/

rsync -av /path/to/dir remote:/path/to とか別の書き方もあるけどパット見わかりづらいので ダメ

ディレクトリの末尾に / をつけるのが肝要。

ファイルをコピーしたい場合

コピー元・先両方をファイルのパスで指定する、 もしくは、 コピー元をファイルのパスで、コピー先を末尾に / をつけたディレクトリのパスで指定する。

rsync -av /path/to/file remote:/path/to/file
もしくは
rsync -av /path/to/file remote:/path/to/

おまけ

コピー元・先でパスが同じ場合

コピー元・先でパスが同じなら -R を使うのもよい。コピー先のパス指定ミスが防げるので。

rsync -avR /path/to/dir/ remote:/
rsync -avR /path/to/file remote:/

コピー元がリモートで、複数指定する場合

rsync -av remote:/path/to/file1 remote:/path/to/file2 /path/to/dir/

と書いてもよいが、リモートホスト名は省略できる。

rsync -av remote:/path/to/file1 :/path/to/file2 /path/to/dir/